泛型基础


基本概念/知识

泛型简易定义:

一种定义方式,能使多个类型共享一组代码.泛型允许我们声明类型参数化的代码

术语:

  • 未绑定泛型类型,没有泛型参数的类型  Hastable
  • 已构造类型
     已构造类型又分为两种
  1. 开放类型 List<T>
  2. 闭合类型 List<int>


C#提供5种泛型:
类,接口,结构,委托,和方法,前4个是类型,方法是成员

泛型定义范例,以类举例

以方法举例
  1. static void Main(string[] args)
    {
        m<string>("666");//可以指定类型
        m("sbsbsb");//也可以不指定,因为这里能自动推断
        Console.ReadKey();
    }
    public static void m<T>(T a)
    {
        Console.WriteLine(a);
    }
委托举例
public delegate void WeiTuo <T>(T arg)

接口举例
  1. public interface IFlyable<T>
    {
        void Fly(T msg);
        T GetTValue(T msg);
    }

泛型约束

限制类型参数的选取范围
语法:
where 类型参数:约束列表//每个条件用 , 隔开

有五种类型约束





举例说明:
1,约束了T只能是值类型,无法约束具体是什么值类型
  1. class MyClass<T> where T : struct
    {}
    
2,约束了T只能是引用类型不能是值类型
  1. class MyClass<T> where T : class
    {}
    
3,限制T必须是实现了某个接口的类型,要求T必须是实现了IComparable接口的子类型对象或者就是该接口类型对象 
  1. class MyClass<T> where T : IComparable
    {}​​​​
4,要求T必须是Person类型,或者是Person类的子类
   要求将来传递进来的类型必须具有一个无参数的构造函数
  1. class MyClass<T> 
         where T : Person
         where T : new()
    {}
    
5,对T没有要求,但是V必须是T类型或者T类型的子类型
  1. class MyClass<T, V>
     where V : T
    {}
    

泛型约束也适用于泛型方法!!

协变

“协变”->”和谐的变”->”很自然的变化”->object类型引用string

Dog是Animal的子类,Animal引用Dog是显然成立的
但是类型为Dog或Animal的委托不能有这种引用操作,在类型上,类型为Dog和Animal的委托是同等级的,他们都派生至delegate.

如果要完成引用操作,需把
delegate T Factory<T>();改为delegate T Factory<out T>();
但是这样以后T只能放在返回值位置

逆变是把T前面加上in,这样T只能放在参数前面


默认值表达式


default语句返回T的默认值
引用类型返回null
DateTime返回0

pubulic void Method<T> (){
    UserMethod(default(T));
}

系统内置的方法委托,泛型委托


Action
Action一定是无返回值的委托,
有泛型的Action和无泛型的Action
非泛型Action,无参数无返回值
定义:public delegate void Action();
泛型Action,有若干个参数,无返回值
VS2010中一共有16个重载,即最多可以写16个参数类型,来代表16个方法参数的类型
public delegate void Action<T1,T2.........>(T1 obj,T2 obj2........)
Func
一定有返回值,若干个参数
Vs2010中有17个重载
public delegate void Func<T1,T2......Tn>(T1 obj ,T2 obj2.....Tn objn)()
尖括号的最后的T一定是返回值类型


泛型推断


static List<T> MakeList(T first,T second)
List<string> list=MakeList<string>("A","B");
List<string> list=MakeList("A","B");//泛型推断


只有泛型方法才能推断

高级部分


泛型的静态成员

public Class MyClass<T>{
    public static string Value;
}
public Class Program{
    public static Main(){
        MyClass<int>.Value="123";
        MyClass<double>.Value="345";
        Console.WriteLine(MyClass<int>.Value);//输出123
        Console.WriteLine(MyClass<double>.Value);//输出345
    }
}
不同封闭类型都有他自己的静态字段集


泛型的遍历

C#1中foreach时候如果枚举器实现了IDisposable 会自动调用之
C#2如果实现了IEnumerable<T>会在循环的末尾(finally块)中无条件调用Dispose,虽然大部分Dispose调用都没做什么
总之泛型的便利会自动调用Dispose()
在Dispose方法中可以放:比如遍历读取文件后关闭文件操作





comments powered by Disqus