C# 学习笔记 9.泛型
1.什么是泛型
实现一个方法可以操作多种数据类型。//类似c++的模板或者STL
2.类型参数
1.根据泛型类型参数是否提供实际类型,又可分为两类:未绑定的泛型和已构造的泛型。
如果没有为类型提供实际类型,称未绑定泛型。反之为已构造的泛型。
2.已构造泛型又分为开放类型和密封类型;
开放类型-包含类型参数的泛型,所有未绑定的泛型都属于开发类型。
密封类型-每个类型参数都传递了实际的数据类型的泛型。
//代码后面补上
3.泛型中的静态字段和静态函数问题
1.每一个封闭的泛型类型都是一个不一样的类型,所以他们都有属于自己的静态字段,静态构造函数也是如此。
public class Type_Static_Name<T>
{
public static string name;
static Type_Static_Name()
{
}
}
4.类型参数的推断
1.使用泛型时可以不用写"<>"符号可以通过编译器进行类型推断,帅!
2.泛型推断只能用于泛型方法,泛型类则不适用,因为编译器不能通过泛型类的
构造函数推断出实际的类型参数。
private static void genericMethod<T>(T t1, T t2)
{
T tem = t1;
t1 = t2;
t2 = tem;
Console.WriteLine( t1);
}
genericMethod<string>("aa", "cc");
genericMethod("aa", "bb");
5.类型参数的约束
1.使用where T : IComparable的代码,其中while语言来使用类型参数
接口继承IComparable接口,从而对类型参数进行约束。如果没有这么写
CompareTo就会出问题,编译器不知道T类型有没有提供这样的方法。
public static class compare<T> where T : IComparable
{
public static T compareGeneric(T t1, T t2)
{
if (t1.CompareTo(t2) > 0)
{
return t1;
}
else
{
return t2;
}
}
}
2.c#中有4种约束可以使用,它们的语法类似:约束要放在泛型方法或者类,声明的末尾,
并且使用where关键字.
1)引用类型的约束
引用类型约束的表示形式T:class,它确保传递的类型实参必须是引用类型.
可以为任何类,接口,委托,或者数组等,不能指定特殊的引用类型
system.object,system.Array,system.Delegate,system.MulicastDelegate,
system.ValueType,System.Enum system.Void
using system.io
public class sampler_ference<T> where T : stream
{
public void Test(T stream)
{
stream.Close();
}
}
where T: stream 告诉编译器传入的类型必须是system.io.stream
2)值类型约束
值类型约束的表达形式为 T:struct,它确保掺入的类型实参是值类型(包括枚举)但这里的值
不包括可空类型.
3).构造函数约束类型
构造函数类型的约束的表达形式为T:new(); 如果约束类型有多个此约束必须最后指定.
构造函数类型约束确保指定的类型实参有要给公共无参构造的非抽象类型.
不能同时指定struct约束,编译器认为这样的指定多余.
4).转化类型约束.
形式: T: 基类名 ,T 接口名
或者T:U 前面一种类型必须后面类型的实参或后面类型实参子类

5).组合约束
组合约束是将多种不同种类的约束合并在一起.
1.注意类型冲突. 引用和值.
2.类放在接口前面.
3.不同类型参数可以有不同的约束,但每种类型参数,必须分别单独使用一个where关键字.
//有想到c++的模板 特化和偏特化,后面看看,再写一下。