1. object类型是一切类型的父类;
2. 通过继承,子类拥有父类的一切属性和行为;任何父类出现的地方,都可以用子类来代替。(这是c#面向对象,继承的性质)
传统: 在方法声明的时候,就要写死参数的类型。(已婚男人)
object 作为“亚当”,任何一个类型都可以传入。
object作为引用类型,加入传入一个值类型,会有装箱。
值类型与引用类型,栈与堆。(内存操作)
从栈到堆,叫装箱;从堆到栈,叫拆箱。装箱拆箱会有性能损失。
线程栈,堆——对象的共享。
详细进一步了解值类型与引用类型,栈与堆。
Framework2.0以后推出泛型新语法;
1. 泛型解决的问题,用一个方法,满足不同参数类型,做相同的事情。
2. 泛型并不是语法糖,而是有框架升级提供的功能。
需要编译器支持+JIT支持。JIT编译变成机器码。泛型生成占位符的东西。CLR……
泛型是由于整个.net平台升级后才支持的。
3. 泛型没有写死类型,调用的时候才指定的类型。(未婚男人)
延迟声明,延迟思想。把参数类型的声明推迟到调用。泛型根本的设计思想。
4. 架构设计/程序设计的思想:推迟一切可以推迟的。利用延迟思想。目的为了提升性能。
5. 另外开放闭合思想。
6. 泛型能做到“又叫马儿跑又能不叫马儿吃草”,原因是框架的设计。Framework框架
1 | /// <summary> |
泛型方法的使用和价值
用一个方法,满足不同参数类型,做相同的事情。
泛型类
** 用一个类型,满足不同的具体类型**,做相同的事情。
1 | public class CommonClass:GenericClass<int>//使用继承,必须指定类型 |
仓储项目,ORM项目应用使用较高。
泛型接口
** 用一个接口,满足不同具体类型的接口**,做相同的事情。
泛型类型的返回值。
泛型既可以写在参数上也可以写在返回值上。
泛型委托
1 | public delegate void SayHi<T> (T t);//泛型委托 |
泛型约束
** **泛型:不同参数的类型都能进来,但“你不知道我是谁?”
泛型约束:where T
基类约束:where T : People 保证T一定是People或是People的子类。
接口约束:where T : ISports
引用类型约束:where T :class T tNew=null;此时成立。 引用类型可以是null,值类型不可以
值类型约束:where T : struct T tNew=0; 此时报错误。 DataTime就是一个值类型。 T tNew=default(T);//会根据T的不同赋予不同的默认值。
where T : Int32 此时报错误。 作为约束必须是接口、非密封类或类型参数。 struct是密封类(sealed),密封类是不能被继承的。
无参数构造函数约束:where T : new() T tNew=new T(); 必须包含一个无参数的构造函数。
叠加约束:where T : People,ISports,new() , 约束可以叠加更灵活!!!
约束,使用根据情况而定。 安全稳健,开放闭合原则。
约束的核心思想(关键):你
1.可以使用基类的一切属性方法。
2.强制保证T一定是People或People的子类。
协变/逆变:
** **容器和内容的理解
01、协变
1 | .net4.0发布。 |
1 | List<Bird> birdlist01 = new List<Sparrow>();//这个是错误的。这个理解也很关键。 |
** 理解:**
两个List之间不存在父子关系。所以要保证两个List类型一样。
框架升级之后:
1 | IEnumerable<Bird> birdList02=new List<Sparrow>();//这个是对的, //协变,Bird 作为out out只能出现在返回值,协变只能委托、接口用。 |
02、逆变
1 | ICustomerListIn<Sparrow> customerList001=new CustomerListIn<Bird>(); |
03、协逆变同时存在
1 | public interface IMyList<in inT,out outT> |
1 | IMyList<Sparrow,Bird> myList01=new MyList<Sparrow,Bird>(); //正常 |
协变逆变一般都是框架声明用。
泛型缓存
**
**
** **静态的东西,在程序中是唯一的。
缓存的学习。第一次需要计算,后面不需要计算。
适合不同类型,需要缓存一份数据的场景,效率高!类似字典,但比字典效率快很多!
字典是一种Hash分布 key value,性能浪费!需要寻址。
缓存,根据内存拿!直接拿!
数据库查询应用等!还是框架使用较好!
不能主动释放!
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/cSharpNote/CSharp高级进阶教程_01_泛型 约束 协变、逆变/
- 版权声明: 梁俊可工作室