C# 泛型讲解_泛型基础
一、C# 泛型概念
简介:
泛型是.NET Framework2.0新增的一个特性,在命名空间System.Collections.Generic,包含了几个新的基于泛型的集合类,官方建议.net 2.0 及更高版本的应用程序使用心得泛型集合类,而不使用非泛型集合类,例如ArrayList。
官方解释:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
泛型的定义主要有以下两种:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明
泛型优点:
1.使用泛型类、方法,我们可以极大提高代码的重用性,不需要对类型不同代码相同(仅类型参数不同)的代码写多次。
2.创建泛型类,可在编译时创建类型安全的集合
3.避免装箱和拆箱操作降低性能,在大型集合中装箱和拆箱的影响非常大.
二、泛型分类
常见的泛型类型:
泛型方法、泛型类、泛型接口,泛型数组、泛型委托,泛型结构体
1.泛型方法
public void MyGenericMethod<T>()
{
//......
}
2.泛型类
class MyGenericClass<T>
{
//......
}
3.泛型接口
interface GenericInterface<T>
{
void GenericMethod(T t);
}
4.泛型数组
public T[] GenericArray;
List<T>
5.泛型委托
public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input);
6.泛型结构体
struct MyGenericStruct<T>
{
}
三、泛型约束,关键词 where
使用关键字where。 下面列出了6中类型的约束
where T: struct
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)。
where T : class
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
where T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
where T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
where T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
where T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。
我们在看看上面那个交换两个变量的方法SwapGeneric,加上必须是值类型的约束
四、泛型关键词 default
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:
-
T 是引用类型还是值类型。
-
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。
namespace MyGeneric
{
class Program
{
static void Main(string[] args)
{
object obj1=GenericToDefault<string>();
object obj2 = GenericToDefault<int>();
object obj3 = GenericToDefault<StructDemo>();
Console.ReadKey();
}
public static T GenericToDefault<T>()
{
return default(T);
}
}
public struct StructDemo
{
public int Id { get; set; }
public string Name { get; set; }
}
}
更多: