c#语法之泛型的多种应用

  

本篇文章主要介绍泛型的应用。

  

泛型是.NET 工作2.0版类库就已经提供的语法,主要用于提高代码的可重用性,类型安全性和效率。

  


  

  

下面定义了一个普通类和一个泛型类,我们可以明确看到泛型类和普通类最大的区别就是多了一个& lt; T>。

  

所以,这个& lt; T>就标记了,这个类是泛型类,其中这个T,也可以写成A, B, C, D或其他字符。

        公共类通用   {   公共字符串名称;   }   公开课Generic   {   公共T名称;   }   之前      

泛型,顾名思义,就是泛指的类型。好比男人,女人,白的人,黑的人,可以泛称为【人】。

  

但类型只能是一个类型。那么泛型和类型之间是什么关系呢?

  

其实很简单,泛型在定义的时候,是泛指类型;在使用的时候,就需要被指定,到底使用哪个类型。

  

即,使用时,就不在是泛指类型,而是特定类型。

  

好比,定义时,定义了一个人。但在使用时,必须明确指定,到底是黑人还是白人。

  


  

  

泛型类跟普通类的使用方式一样,都需要实例化对象,再由对象来调用内部的属性或方法。

  

下面代码实例化了泛型通用的,实例化时,还指定了该泛型通用的指定类型为字符串。

  

所以要给泛型通用的属性名称赋值,就需要赋值字符串类型的值。

        公共静态孔隙Excute ()   {   Genericgs=new Generic ();   gs。Name=" Kiba518”;   }   之前      

下面代码定义了一个Int类型的泛型通用。

        公共静态孔隙Excute ()   {   Genericgs=new Generic ();   gs。Name=518;   }   之前      


  

  

泛型的默认值,如下面代码所示。需要使用默认(T)来赋值。

  

不管泛型到底是字符串,整数,布尔值或者是一个类的类型,都可以被自动赋值。

        公共静态孔隙Excute ()   {   Genericgs=new Generic ();   gs。Name=518;   GenericgsTask=new Generic ();   gsTask。Name=新任务(()=比;{   Console.WriteLine (“Kiba518”);   });   }      公开课Generic   {   公共T Name=违约(T);   }   之前      


  

  

在泛型类中,有个特别的约束可供我们使用。

  

当我们不显示的声明时,这个约束不存在。但当我们显示的声明的时候,这个约束就会执行。

  

下面,我们来看看这个特别的约束。

        公共静态孔隙Excute ()   {   GenericgFanXing=new Generic ();   Generic<比;gFanXing=new Generic<在();//Genericgs=new Generic ();这样定义会报的错   }   公开课GenericT:   {   公共T Name=违约(T);   }   公开课   {   公共字符串名称{;设置;}   }   公共类FanXing:   {   公众新的字符串名称{得到;设置;}   }   之前      

如上面代码所示,【T:,】就是这个特别的约束。

  

当显示声明这个约束的时候,定义会限制泛型的类型。

  

什么是限制泛型的类型呢?

  

很简单,泛型T,是泛指某一个类型。我们在定义泛型类时,还需显示的指定类型,此时我们显示指定的类型,要受这个限制。

  

这个限制就是指【T:,】。

  

它的限制是,要求我们指定的类型T必须是,或者该类型继承自,如FanXing类。

  

  

在c#中,泛型不仅可以用于类,还可以直接用于函数。

  

具体使用方式如下:

        公共静态孔隙Excute ()   {   GenericFunc gf=new GenericFunc ();   gf.FanXingFunc(新FanXing () {Name=" Kiba518 "});   }   公开课GenericFunc   {   公共空间FanXingFunc (T obj)   {   Console.WriteLine (obj.GetType ());   }   }   之前      

很简单、调用泛型函数的时候,指定泛型函数的(指定类型]即可。

  

但是,这里我们发现一个问题,那就是,在泛型函数里,使用泛型对象的时候,我们发现对象都是类型的。

  

那我们如果想使用泛型对象里的属性和方法时,要怎么办呢?

  

也很简单,反射就可以了。

c#语法之泛型的多种应用