标签:
泛型是CLR提供的一种特殊机制,让我们可以先用“类型占位符”来写代码,然后在创建类型的实例时提供真正的类型。在很多时候我们可以把类的行为提取或者重构出来,增加一个抽象层,使之不仅能用于硬编码的类型上,而且可以应用到其他的类型上,即另外一种形式的代码重用。泛型的优点如下:
泛型类型仍然是类型,在使用非泛型类的过程中有两个步骤:声明类,创建类的实例。但是泛型类型不是实际的类型,而是类的模板,所以我们必须先构建实际的类型,然后创建这个实际类型的实例,实际上是在CLR中定义一个新的类型对象,新的类型对象是从泛型类型派生自哪个类型对象。(e.g:MyGeneric<T>派生自Object 所以MyGeneric<DateTime>, MyGeneric<String>也派生自Object)。
泛型类参数命名指导规则:参数命名应该尽量具有描述性,名称还应该以T为前缀,eg: TKey,TValue,TEntity多个类型的参数:泛型类型可以使用任意数量的类型参数 e.g:Action<T,T1,...Tn>
参数约束:约束使用where子句 where TypeParam:constraint,constraint....如果有构造器约束,必须放在最后。
泛型方法:泛型方法可以在泛型类非泛型类结构和接口中声明,泛型方法和泛型类一样有类型参数列表和可选的约束列表。
public class MyClass { internal static void Print<T>(T[] array) { foreach (var item in array) { Console.Write(item.ToString() + " "); } Console.WriteLine(); } } public class Program { private static void Main(string[] args) { var intArray = new int[] {1,2,3,4,5}; var stringArray = new string[] { "hello", "world" }; var doubleArray = new double[] {1.12,2.25,3.141592654}; MyClass.Print(intArray); MyClass.Print<int>(intArray); MyClass.Print(stringArray); MyClass.Print<string>(stringArray); MyClass.Print(doubleArray); MyClass.Print<double>(doubleArray); Console.ReadKey(); } }
泛型方法重载:C#是依据方法名称,参数类型,参数数量,参数顺序来定义函数的唯一性,并不包括方法的返回值类型,因此我们可以从这几个方面来看泛型方法的重载。
不能进行重载的方法组有:
可以重载的方法组有:
泛型方法的重写:重写一个虚泛型方法是,或者创建一个显式接口方法实现时,约束是隐式继承的,不可以重新声明。
public class BaseClass { public virtual void Mymethod<T>(T t) where T : new() { Console.WriteLine("base"); } } public class SubClass : BaseClass { public override void Mymethod<X>(X x) // where X:IComparable 在重写的过程中,抽象类中的抽象方法的约束是被默认继承的 因此不能直接指定约束 { Console.WriteLine("sub"); base.Mymethod<X>(x); } }
泛型接口允许我们编写参数和接口成员返回类型是泛型类型参数的接口。泛型接口的声明和非泛型类型接口声明基本一致,只是声明接口名称后添加类型参数。实现泛型类型接口时,必须没有可能的类型实参组合会在类型中产生两个重复的接口。下面的例子中,如果第二个接口把int作为类型实参,类型就会有两个相同的接口。
interface IGeneric<T> { T ReturnValue(T value); } class MyGeneric<U>:IGeneric<int>,IGeneric<U> { public int ReturnValue(int value) { throw new NotImplementedException(); } public U ReturnValue(U value) { throw new NotImplementedException(); } }
每个泛型类型的参数都可以标记为协变量或者逆变量。利用这个功能,可以将泛型类型的一个变量转换成另外一个变量,从而大大提高了泛型参数的兼容性。
标签:
原文地址:http://www.cnblogs.com/dynamic-xia/p/4596821.html