时间:2021-05-20
本篇文章主要介绍泛型的应用。
泛型是.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; }}输出结果如下:
这样我们就得到了我们想要的结果,如果想使用泛型类里的函数,道理也一样,只需要用反射来调用即可。
结语
看到这里,有些同学可能会觉得泛型很复杂,连使用其对象下的属性,都得反射,太繁琐了,还不如不用呢。
有这样想法的同学,心里想想就好了,如果对老司机这么说,他肯定会内心默默的微笑,然后对你说,你想的没错。
然后,你就没有然后了。
泛型的应用,开篇已经说了,主要用在提高代码的可重用性、类型安全性和效率上。
如果只是定义一个类,调用一个属性,那泛型的存在就是鸡肋。
但事实上,我们的系统永远只有更复杂,更复杂,更复杂。因此泛型才有了用武之地。
----------------------------------------------------------------------------------------------------
注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,只是语法糖,在编译器编译的时候都转换成object类型类型通配
在C#开发中,必不可少的要用到泛型。泛型是.NET2.0版本就有的,它广泛应用于C#框架中容器的使用中。下面我们来详细介绍一下。 一、泛型的主要优势
一、泛型的基本概念java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别
上篇文章给大家介绍了浅析C#中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c#泛型类型,说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我
本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下:首先需要明白什么时候使用泛型:当针对不同的数据类型,采用相似的逻辑算法,为了