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

 更新时间:2019年07月25日 14:14:02   作者:Kiba518  
这篇文章主要介绍了C#语法之泛型的多种应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

泛型是.NET  work 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< > gFanXing = new Generic< >();
  //Generic<string> gs = new Generic<string>(); 这样定义会报错
}
public class Generic<T> where T :
{
  public T Name = default(T);
}
public class  
{
  public string Name { get; set; }
}
public class FanXing :
{
  public new string Name { get; set; }
}

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

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

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

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

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

它的限制是,要求我们指定的类型T必须是 ,或者该类型继承自 ,如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());
  }
}

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

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

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

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

下面我们添加一个反射函数GetPropertyValue,专门用来获取属性。

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

输出结果如下:

这样我们就得到了我们想要的结果,如果想使用泛型类里的函数,道理也一样,只需要用反射来调用即可。

结语

看到这里,有些同学可能会觉得泛型很复杂,连使用其对象下的属性,都得反射,太繁琐了,还不如不用呢。

有这样想法的同学,心里想想就好了,如果对老司机这么说,他肯定会内心默默的微笑,然后对你说,你想的没错。

然后,你就没有然后了。

泛型的应用,开篇已经说了,主要用在提高代码的可重用性、类型安全性和效率上。

如果只是定义一个类,调用一个属性,那泛型的存在就是鸡肋。

但事实上,我们的系统永远只有更复杂,更复杂,更复杂。因此泛型才有了用武之地。

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#实现文件分割和合并的示例详解

    C#实现文件分割和合并的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现文件分割和合并的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 分享两种实现Winform程序的多语言支持的多种解决方案

    分享两种实现Winform程序的多语言支持的多种解决方案

    本篇文章主要介绍了分享两种实现Winform程序的多语言支持的多种解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2017-02-02
  • C#统计字符串的方法

    C#统计字符串的方法

    这篇文章主要为大家详细介绍了C#统计字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#窗体读取EXCEL并存入SQL数据库的方法

    C#窗体读取EXCEL并存入SQL数据库的方法

    这篇文章主要介绍了C#窗体读取EXCEL并存入SQL数据库的方法,实例简述了实现读取excel及写入SQL数据库的原理与技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C# WebApi Get请求方式传递实体参数的方法示例

    C# WebApi Get请求方式传递实体参数的方法示例

    这篇文章主要给大家介绍了关于C# WebApi Get请求方式传递实体参数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • C#语法相比其它语言比较独特的地方(三)

    C#语法相比其它语言比较独特的地方(三)

    这篇文章主要介绍了C#语法相比其它语言比较独特的地方(三),本文讲解了在C++中允许从一个case贯穿到另一个case标签、as和is只会检测待转化类型的类型,而不会进行其它操作等内容,需要的朋友可以参考下
    2015-04-04
  • c# 如何实现web打印插件

    c# 如何实现web打印插件

    本文的实现思路主要是Web端通过WebSocket将Html发送给客户端,客户端(Winform)监听消息,接收处理后再打印,有该需求的朋友可以参考下本文
    2021-06-06
  • c#裁剪图片后使用zxing生成二维码示例分享

    c#裁剪图片后使用zxing生成二维码示例分享

    这篇文章主要介绍了c#裁剪图片后使用zxing生成二维码的示例,大家参考使用吧
    2014-01-01
  • C#中使用ADOMD.NET查询多维数据集的实现方法

    C#中使用ADOMD.NET查询多维数据集的实现方法

    这篇文章主要介绍了C#中使用ADOMD.NET查询多维数据集的实现方法,详细讲述了C#中使用ADOMD.NET查询多维数据集的原理与实现技巧,需要的朋友可以参考下
    2014-10-10
  • Visual Studio 2019配置vue项目的图文教程详解

    Visual Studio 2019配置vue项目的图文教程详解

    这篇文章主要介绍了Visual Studio 2019配置vue项目的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论