C# 泛型(学习笔记)
2011-01-20 12:49
387 查看
1 概述:
自从.Net 2.0 发布以来,.Net就开始支持泛型,泛型不仅仅是C#语言的一部分,它和微软中间语言(IL)一起紧密集成在程序集中,使用泛型,你可以创建独立于内置类型的类和方法,可以只创建一个类或者方法来替代许多功能相同,但是类型不同的类和方法。(有点绕)
泛型被定义在CLR中,而不仅仅是C#中,所以在C#中定义的类,可以用VB中的特定类型来实例化。(翻译的不知道准确不)
2 泛型的优点:
(1) 性能(Performance):
泛型的最大优势就是性能,在使用集合类时,非泛型的集合类涉及到值类型与引用类型的相互转换的时候,会导致装箱与拆箱的发生。下面以ArrayList为例简要说明:
Var list=new ArrayList();
list.add(12);//自动装箱,因为Add()方法需要Object类型参数
int i=(int) list[0];//拆箱 转换成值类型
foreach(int i in list)
{
Console.WriteLine(i); //拆箱
}
装箱和拆箱对应用程序性能会有很大影响,特别是在集合中有很多个元素需要迭代的时候。而使用泛型的List<T>,指定T的类型后,就不会发生装箱与拆箱。
(2) 类型安全(Type Safety):
泛型的另一个特点就是类型安全的,以上面的ArrayList为例,任何对象都有可能被添加进集合中,比如:list.add(13),list.add(“Hello”),编译器不会报错,但当使用下面的foreach迭代时,由于list.add(“Hello”),添加的元素不能被转换成int类型,将会产生运行时异常。
foreach(int i in list)
{
Console.WriteLine(i);
}
而使用List<T>,T 可以明确指定集合中允许添加的类型,这样可以保证添加进集合中元素的合法性。
(3) 二进制代码的复用(Binary Code Reuse):
泛型类能够被定义一次,而实例化多次。
3 泛型的特点:
1)不能将null赋值给泛型。因为泛型可以被实例化为值类型,而null只能应用在引用类型上。解决方法是使用default关键字,default(T) 默认将值类型初始化为0,引用类型初始化为null。
2) 泛型的约束:
注:1.构造器约束:只能为默认构造器定义约束,而不能为其他构造器定义约束。
2.可以为泛型同时定义多个约束,用逗号分隔。
4 Covariance and Contra-variance:
5 泛型结构Nullable<T>:
1)定义可空类型 Nullable<int> x1和int ? x2两种方式;
2)可空类型可用于算术运算,可以将非可空类型转换成可空类型。
Int x=3; int ? y=x;
3) 可空类型转换成非可空类型,必须显示转换。
Int ? x=…; int y=(int)x; 或者使用“??”来进行转换,int y1=x ?? 0 ; 这里如果x为null,则y1的值为0;
6 泛型方法:
1)泛型方法可以带有泛型约束。
2)泛型方法中代理的使用。
自从.Net 2.0 发布以来,.Net就开始支持泛型,泛型不仅仅是C#语言的一部分,它和微软中间语言(IL)一起紧密集成在程序集中,使用泛型,你可以创建独立于内置类型的类和方法,可以只创建一个类或者方法来替代许多功能相同,但是类型不同的类和方法。(有点绕)
泛型被定义在CLR中,而不仅仅是C#中,所以在C#中定义的类,可以用VB中的特定类型来实例化。(翻译的不知道准确不)
2 泛型的优点:
(1) 性能(Performance):
泛型的最大优势就是性能,在使用集合类时,非泛型的集合类涉及到值类型与引用类型的相互转换的时候,会导致装箱与拆箱的发生。下面以ArrayList为例简要说明:
Var list=new ArrayList();
list.add(12);//自动装箱,因为Add()方法需要Object类型参数
int i=(int) list[0];//拆箱 转换成值类型
foreach(int i in list)
{
Console.WriteLine(i); //拆箱
}
装箱和拆箱对应用程序性能会有很大影响,特别是在集合中有很多个元素需要迭代的时候。而使用泛型的List<T>,指定T的类型后,就不会发生装箱与拆箱。
(2) 类型安全(Type Safety):
泛型的另一个特点就是类型安全的,以上面的ArrayList为例,任何对象都有可能被添加进集合中,比如:list.add(13),list.add(“Hello”),编译器不会报错,但当使用下面的foreach迭代时,由于list.add(“Hello”),添加的元素不能被转换成int类型,将会产生运行时异常。
foreach(int i in list)
{
Console.WriteLine(i);
}
而使用List<T>,T 可以明确指定集合中允许添加的类型,这样可以保证添加进集合中元素的合法性。
(3) 二进制代码的复用(Binary Code Reuse):
泛型类能够被定义一次,而实例化多次。
3 泛型的特点:
1)不能将null赋值给泛型。因为泛型可以被实例化为值类型,而null只能应用在引用类型上。解决方法是使用default关键字,default(T) 默认将值类型初始化为0,引用类型初始化为null。
2) 泛型的约束:
Where T : struct | struct约束,T必须是值类型的 |
Where T: class | class约束,T必须是引用类型的 |
Where T:IFoo | T必须实现接口IFoo |
Where T: Foo | T必须继承自基类Foo |
Where T: new() | 构造器约束,T必须有一个默认的构造器 |
Where T1: T2 | T1必须继承泛型T2 |
2.可以为泛型同时定义多个约束,用逗号分隔。
4 Covariance and Contra-variance:
5 泛型结构Nullable<T>:
1)定义可空类型 Nullable<int> x1和int ? x2两种方式;
2)可空类型可用于算术运算,可以将非可空类型转换成可空类型。
Int x=3; int ? y=x;
3) 可空类型转换成非可空类型,必须显示转换。
Int ? x=…; int y=(int)x; 或者使用“??”来进行转换,int y1=x ?? 0 ; 这里如果x为null,则y1的值为0;
6 泛型方法:
1)泛型方法可以带有泛型约束。
2)泛型方法中代理的使用。
相关文章推荐
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
- C#中泛型学习笔记
- C# in Depth Third Edition 学习笔记-- C#2.0: 解决C#1.0的问题 1 泛型
- c# 泛型 - 学习笔记
- C#学习笔记-接口,集合与泛型
- C#学习笔记-泛型
- C#学习笔记-泛型
- c# 泛型 - 学习笔记
- 精通C#:Chapter9 集合与泛型-学习笔记
- C#中泛型学习笔记
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
- C#学习笔记15-泛型
- 新手菜鸟学习C#的笔记总结 之泛型
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- c#学习笔记之泛型
- C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器
- [C#]C#学习笔记-接口,集合与泛型
- C#回顾学习笔记三十五:泛型集合List
- [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
- (转载)C#中泛型学习笔记