Fire my passion

Anything with my most passion……
补习泛型

      泛型最根本的作用就是代码重用,将函数的逻辑抽象出来,而不去细化将要处理的对象类型。我所知道的以往的抽象都是在一个具体的类型下,为了避免做重复的工作,而进行的抽象。由于泛型的出现,便可以进行进一步的代码抽象工作了
首先,先来说几个关键的概念
泛型类
 作用是封装不特定于具体数据类型的操作
泛型类型参数
 类型参数是客户端在实例化泛型类型的变量时指定的特定类型的占位符
约束
 使用 where 上下文关键字指定,对客户端代码能够在实例化类时用于类型参数的类型种类施加限制 。以下是具体说明。
  T:结构
   类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)。
  T:类
   类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
  T:new()
   类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
  T:<基类名>
   类型参数必须是指定的基类或派生自指定的基类。
  T:<接口名称>
   类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
  T:U
   为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
泛型接口
 对于泛型类,使用泛型接口可以避免值类型的装箱和取消装箱操作
泛型方法
 泛型方法是使用类型参数声明的方法
泛型委托
 可以定义自己的类型参数,指定类型参数以创建已关闭的构造类型
 
个人总结:
1.先从泛型接口开始,甚至普通接口开始,定义一些基本的操作。普通接口中可以定义一些不需要类型参与的操作,而在泛型接口中定义类型相关的方法、属性、委托等
2.创建泛型类,将某种类型抽象成为类型参数,同时要考虑类型参数的约束。需要注意的是
 “非泛型(具体)类可以从封闭式构造基类继承,但无法从开放式构造类或裸类型参数继承”。也就是说如果普通类要继承泛型类,那必须为泛型类提供具体的类型参数
 “从开放式构造类型继承的泛型类必须为任何未被继承类共享的基类类型参数提供类型变量”。也就是如果泛型子类在继承父类时,只继承了部分类型参数,那么在继承时,需要给父类提供未继承到子类的类型参数的具体类型
 “从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束”。约束必须在子类中重新声明
 其次,类型参数中的类的继承关系,在泛型操作中无效。即:
 “输入参数指定 List<BaseClass>,则当试图提供 List<DerivedClass> 时,将会发生编译时错误”
 再次,在泛型类中,非泛型方法可以访问类级别的泛型参数
 最后,在泛型类中定义泛型方法时,需要为方法的类型参数提供其他标识符,不要和类级别的类型参数标识符相同,否则生成警告 CS0693

3.在定义泛型委托时,指定的类新参数可以是返回值的类型或者参数的类型,在实例化委托的时候才需要进行类型参数的具体指定。
Del<int> m1 = new Del<int>(Notify);
简写模式
Del<int> m2 = Notify;
 
相关知识
default关键字的作用可以返回类型的默认值,值类型返回0;引用类型返回null。在一般情况下作用不能体现,但是如果是泛型就有意义了,如:
default(T)
如果T代表值类型则返回0,否则返回null

泛型集合中的几个新方法
List.ConvertAll
 public List<TOutput> ConvertAll<TOutput> (
  Converter<T,TOutput> converter
 )
List.Find   //找到第一个匹配的项
 public T Find (
  Predicate<T> match
 )
List.FindAll  //匹配所有
List.FindIndex  //找到匹配项的索引
 List.FindIndex (Generic Predicate)
 List.FindIndex (Int32, Generic Predicate) Int32:StartIndex
 List.FindIndex (Int32, Int32, Generic Predicate) Int32:StartIndex;Int32 count
List.FindLast  //找到最后一个匹配项
List.FindLastIndex
List.ForEach
 public void ForEach (
  Action<T> action
 )

 public delegate TOutput Converter<TInput,TOutput> (TInput input)
 public delegate bool Predicate<T> (T obj)
 public delegate void Action<T> (T obj)

匿名方法简介
匿名方法就是将以前写在外部方法中的代码,直接放在委托发生的地方,减少了实例化委托所需的编码系统开销。在匿名方法中可以可以使用外部变量,但是不能使用ref和out变量

posted on 2008-01-25 14:48  everx  阅读(723)  评论(0编辑  收藏  举报