第12章 泛型(C++的模板)
12.1泛型的概念
在C++中,编译器可以检测出在哪里使用了模板的某个特定类型,例如,模板B的A类型,然后编译需要的代码,来创建这个类型。而在C#中,所有的操作都在运行期间进行。
12.2使用泛型
12.2.1可空类型(nullabletype)
System.Nullable<type>,null,HasValue
System.Nullable<type>=type?
1. 运算符和可空类型
2. ??空接合运算符(nullcoalescing operator),
Op1??op2; op1==null?op1:op2;
12.2.2 System.Collections.Generic名称空间
1.List<T>
List<T>myCollection=new List<T>();
CollectionBase主要用于向后兼容,使用CollectionBase的唯一场合是更多的控制向类的用户展示的成员。
2.对泛型列表进行排序和搜索
使用泛型接口IComparer<T>和Icomparable<T>
System.Text.StringBuilder:Append(),AppendFormat(),ToString();
Comparison<T>:这个委托类型用于排序方法,其返回类型和参数是int method(T objectA,T obejct B);
Predicate<T>:这个委托类型用于搜索方法,其返回类型和参数是bool method(T targetObject);
3. Dictionary<K,V>
Dictionary<keyType,valType>things=new Dictionary<keyType,valType>();
Foreach(keyType key in type.Keys)
{}
Foreach(valType key in type.Values)
{}
Foreach(KeyValuePair<keyType,valType>thing in things)
{}
Dictionary<K,V>允许把IComparer<K>接口传递给其构造函数。?
IComparer<T>,IComparable<T>比较
12.3定义泛型
12.3.1定义泛型类
Class MyGenericCLass<T>
{
}
不知道T的类型,在类的定义中不能使用它的构造函数,不能使用new T();
1.default关键字:引用null,值:默认值。
innerT1Object=default(T1);
2.约束类型:限制泛型中可使用的数据类型
WhereT1:constraint1
3.从泛型类中继承
继承类型封闭,非泛型类继承泛型类,要明确泛型类中的所有类型参数。
4.泛型运算符
Publicstatic implicit operator List<Animal>(Farm<T> farm)
{}
5.泛型结构
12.3.2定义泛型接口
InterfaceMyFarmingInterface<T>
WhereT:Animal
{}
12.3.3定义泛型方法
Public T GetDeafult<T>()
{
Return default(T);
}
12.3.4定义泛型委托
Public delegate T1MyDelegate<tT1,T2>(T2 op1,T2 op2) where T1:T2;