天天看点

C#入门经典第十二章

第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;