大家得以显著看见泛型类和日常性类最大的分别便是多了一个澳门新蒲京官网&lt

本篇作品主要介绍泛型的接纳。

泛型是.NET Framework 2.0
版类库就已经提供的语法,首要用来加强代码的可重用性、类型安全性和频率。

泛型的概念

上面定义了三个普通类和二个泛型类,大家得以显然见到泛型类和常见类最大的区分就是多了一个<T>。

就此,那一个<T>就标识了,那个类是泛型类。其中那么些T,也能够写成A,B,C,D或此外字符。

public class Generic
{
    public String Name;
}

public class Generic<T>
{
    public T Name;
}

泛型,一孔之见,正是泛指的花色。好比男士,女子,黄人,黄种人,能够泛称为【人】。

但品种只好是一个档期的顺序。 那么泛型和连串之间是何许关联吗?

实际非常粗略,泛型在概念的时候,是泛指类型;在行使的时候,就必要被钦赐,到底使用哪个项目。

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

比方,定义时,定义了一人。但在行使时,必需通晓内定,到底是白种人照旧白人。

泛型的应用

泛型类跟普通类的施用方法同样,都供给实例化对象,再由对象来调用内部的性质或措施。

上面代码实例化了泛型Generic,实例化时,还内定了该泛型Generic的钦点项目为String。

据此要给泛型Generic的属性Name赋值,就必要赋值字符串类型的值。

public static void Excute()
{
    Generic<String> gs = new Generic<String>();
    gs.Name = "Kiba518";
}

上面代码定义了一个Int类型的泛型Generic。

public static void Excute()
{
    Generic<int> gs = new Generic<int>();
    gs.Name = 518;
}

泛型的默许值

泛型的暗许值,如上面代码所示。需求选择default(T)来赋值。

无论是泛型到底是String,int,bool恐怕是一个Class类型,都能够被机关赋值。

public static void Excute()
{
    Generic<int> gs = new Generic<int>();
    gs.Name = 518;
    Generic<Task> gsTask = new Generic<Task>();
    gsTask.Name = new Task(()=> {
        Console.WriteLine("Kiba518");
    });
}

public class Generic<T>
{
    public T Name = default(T); 
}

泛型的约束

在泛型类中,有个专门的牢笼可供大家接纳。

当大家不显得的扬言时,那一个约束不设有。但当大家来得的声明的时候,那么些约束就能够试行。

上面,我们来寻访那几个非常的约束。

public static void Excute()
{ 
    Generic<FanXing> gFanXing = new Generic<FanXing>();
    Generic<Base> gFanXingBase = new Generic<Base>();
    //Generic<string> gs = new Generic<string>(); 这样定义会报错
} 
public class Generic<T> where T : Base
{
    public T Name = default(T); 
} 
public class Base  
{
    public string Name { get; set; }
}
public class FanXing : Base
{
    public new string Name { get; set; }
}

如上边代码所示,【where T : Base】正是那么些特别的封锁。

当呈现证明那个约束的时候,定义会限制泛型的门类。

怎么是限制泛型的花色呢?

很简短,泛型T,是泛指某贰个品种。大家在概念泛型类时,还需出示的钦赐项目,此时我们来得内定的门类,要受那几个界定。

本条范围正是指【where T : Base】。

它的限定是,须要大家内定的类型T必得是Base,大概该类型承接自Base,如FanXing类。

泛型的函数

在C#中,泛型不仅可以够用来类,还足以平昔用于函数。

切实选拔格局如下:

 public static void Excute()
 {
     GenericFunc gf = new GenericFunc();
     gf.FanXingFunc<FanXing>(new FanXing() { Name="Kiba518"});
 }
 public class GenericFunc
 {
     public void FanXingFunc<T>(T obj)
     {
         Console.WriteLine(obj.GetType());
     }
 }

一点也不细略,调用泛型函数的时候,内定泛型函数的[钦定项目]即可。

唯独,这里大家开采一个难点,这正是,在泛型函数里,使用泛型对象的时候,大家发掘指标都以object类型的。

这咱们假诺想行使泛型对象里的习性和方式时,要如何做吧?

也很简短,反射就能够了。

上面大家抬高贰个反射函数GetPropertyValue,特意用来获取属性。

public class GenericFunc
{
    public void FanXingFunc<T>(T obj)
    { 
        var name = GetPropertyValue(obj, "Name");
        Console.WriteLine(name); 
    }
    public object GetPropertyValue(object obj, string name)
    {
        object drv1 = obj.GetType().GetProperty(name).GetValue(obj, null);
        return drv1;
    }
}

出口结果如下:

澳门新蒲京官网 1

与此相类似大家就赢得了笔者们想要的结果,固然想选拔泛型类里的函数,道理也同等,只要求用反射来调用就能够。

结语

看看这里,某些同学或然会认为泛型很复杂,连使用其目的下的习性,都得反射,太繁杂了,还不比不用啊。

有如此想方设法的校友,心里商量就好了,假使对老车手那样说,他必定会内心默默的微笑,然后对您说,你想的没有错。

下一场,你就不曾然后了。

泛型的利用,开篇已经说了,主要用在滋长代码的可重用性、类型安全性和频率上。

要是只是概念二个类,调用壹性格能,那泛型的留存正是鸡肋。

但实际,大家的连串恒久唯有更复杂,更复杂,更复杂。因而泛型才有了用武之地。

C#语法——委托,架构的血流

C#语法——元组类型

C#语法——await与async的不错张开药方式


注:此小说为原创,招待转发,请在篇章页面明显地点给出此文链接!
若你以为那篇小说还不易,请点击下右下角的【推荐】,特别谢谢!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website