【C#】——泛型的使用
泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛使用和可交互性的形式来表示算法和数据结构,以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据的类型来进行参数化。泛型能在编译时提供强大的类型检查,减少数据类型之间的显式转换、装箱操作和运行时的类型检查。泛型类和泛型方法同时具备可重用性、类型安全和效率高等特性,这是非泛型类和非泛型方法无法具备的。泛型通常在集合和在集合上运行的方法中。
泛型主要是提高了代码的重用性。
泛型的使用
类型参数T
泛型的类型参数 T 可以看做是一个占位符,它不是一种类型,它仅代表了某种可能的类型。类型参数T可以在使用时用任何类型来代替。
类型参数T的命名准则:使用描述性命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。
例1.
使用代表一定意义的单词作为类型参数 T 的名称。
public interface ISessionChannel<Session>
public delegate TOutput Conbverter<Input,Output>
//将T作为描述性类型参数名的前缀
例2.
使用 T作为类型参数名的前缀
public interface ISessionChannel<TSession>
{
TSession Session{get;}
}
泛型接口
泛型接口的声明形式人如下:
interface 【接口名】
{
【接口体】
}
声明泛型接口时,与声明一般的接口唯一区别时增加了一个。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。泛型类型声明所实现的接口必须对所有可能的构造类型都保持唯一,否则就无法确定该为某些构造类型调用哪个方法。
说明:
在实例化泛型时也可以使用约束对类型参数的类型种类施加限制,约束是使用 where 上下文关键字指定的。
- T:结构——类型参数必须是值类型。可以指定除 Nullable 意外的任何值类型。
- T:类——类型参数必须是引用类型。这一点也适用于任何类、接口、委托或数组类型。
- T:new()——类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。
- T:<基类名>——类型参数必须是指定的基类或派生自指定的基类。
- T:<接口名称>——类型参数必须是指定的接口或实现指定的接口。可以指定多个几口约束。约束接口也可以是泛型。
- T:U——为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。者成为裸类型约束。
例3.
创建一个控制台应用程序,首先一个 Factory 类,在该类中建立一个 CreateInstance 方法。然后再创建一个泛型接口,在这个泛型接口中调用 CreateInstance 方法。根据类型参数 T ,获取其类型。
//创建一个泛型接口
public interface IGennericInterface<T>
{
T CreateInstance(); //接口中调用 CreateInstance 方法
}
//实现上面泛型接口的泛型类
//派生约束 where T:TI (T要集成自TI)
//构造函数约束 where T:new()(T可以实例化)
public calss Factory<T,TI>:IGenericInterface<TI> where T:TI,new()
{
public TI CrateInstance() //创建一个公共方法CrateInstance
{
return new T();
}
}
calss Program
{
static void Main(string[] args)
{
//实例化接口
IGenericInterface<System.ComponentModel.IListSource>factory=
new Factory<Sustem.Data.DataTable,System.ComponentModel.IListSource>():
//输出指定泛型的类型
Console.WriteLine(factory.CreateInstance().GetType().ToSTtring());
Console.ReadLine();
}
}
泛型方法
泛型的声明方式如下:
【修饰符】 void 【方法名】 <类型参数 T>
{
【方法体】
}
泛型方法是在声明中包括了类型参数 T 的方法。泛型方法可以在类、结构或接口声明中声明,这些类、结构或接口本身可以是泛型或非泛型。如果在泛型类型声明中声明泛型方法,则方法可以同时引用该方法的类型参数 T 和包含该方法的声明的类型参数 T。
说明:
泛型方法可以使用多类型参数进行重载。
例4.
创建一个控制动态应用程序,通过定义一个泛型方法来查找数组中某个数字的位置。
public calss Finder //建立一个公共类Finder
{
public static int Find<T>(T items,T item) //创建泛型方法
{
for(int i=0;i<items.Length;i++) //调用for循环
{
if(items[i].Equals(item)) //调用 Equals 方法比较两个数
{
return i; //返回值相等数在数组中的位置
}
}
return -1; //如果不存在指定的数,则返回-1
}
}
class Parogram
{
atatic void Main(string[] args)
{ //调用泛型方法,并定义数组指定数字
int i=Finder.Find<int>(new int[]{1,2,3,4,5,6,8,9,}.6);
//输出中数字在数组中的位置
Console.WriteLine("6在数组中的位置:"+i.ToString());
Console.ReadLine();
}
}
//程序运行结果是“6在数组中的位置为5”