NET中泛型的理解与简单代码示例

原创 2017年12月22日 10:26:46

我有一个梦想,是改变世界,这是很多技术人员的梦想;从小事做起,踏实做人做事,当身边的人或事因为自己能像更好的方向改变或发展的时候,那就是在改变世界,至花甲之时,可能我的梦想也无法实现,但我会一直追逐着他前行。我相信蝴蝶效应。荣耀的背后可这一道孤独。一起学习,一起进步。
泛型是具有占位符的类、结构、接口和方法,是编译器提供的功能
使用泛型–加快运行速度(泛型参数的实际类型参数在运行时均不会被消除,所以运行速度会因为类型转换的次数减少而加快)
用泛型–可用于反射编程(使用GetType方法可在程序运行时得知泛型及其类型参数的实际类型)
用泛型-可减少代码量(复用性)
泛型可使用where关键字进行约束–所以泛型是类型安全的

使用object也能简单实现多方法统一为一个的效果,但是针对值类型,将其作为object进行传参使用的时候,会将其封装为引用类型存入堆中(装箱),使用时候,通过指针指向堆在拆箱进行使用,那么就存在性能损耗;
声明:泛型的声明使用<>进行声明,如,在编译的时候,会编译为一个占位符;
原理:泛型是编译时动态解析(方法声明的时候没有指定参数类型,而是推迟到方法调用的时候进行类型解析指定),在调用的时候,根据你传入的参数的类型指定了具体类型,同时调用的时候,会根据参数类型生成与我们手动编写的实际类型方法一致的方法副本,那么其实在调用的时候,调用的是这个副本,那么就和调用我们手动编写的方法是一致的(只是这些代码是即时编译器–JIT帮我们写了),所以不存在性能损耗;这样一来,也减少的代码量,比如客户端的容量大小可以通过这些细节减少很多;

效率示例:

 public class Person<T> where T : Human,new()
   {
public T obj {get;set;}
   }

编译的时候编译为了一个带有占位符的方法

var person = new Person<Human>();
person.SayHello(new Human()
 {
        Name = "YangJiaoLong",
        Age = 12
  });

在运行时指定了具体参数–Human对象,即时编译器JIT生成具体方法副本

public class Person
   {
public Human obj {get;set;}
   }

在程序运行期间该副本不会被清除,也不存在使用object等类似的强制转换,所以泛型是能够提高程序运行效率的

泛型约束 struct,class,基类名,接口名,new()
1、struct–值类型约束
2、class–引用类型约束
3、基类名–引用类型的一种,但范文确定了必须是该类或派生自该类
4、接口名–应用类型的一种,但范围确定了必须是该接口或派生自该接口
5、new()–必须有无参构造函数,组合使用放在最后,不可和struct组合使用
1,25,35,345,45,5
下面是泛型约束示例

    /// <summary>
    /// 要求泛型参数必须是继承自Human的类或Human类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Person<T> where T : Human,IAnimal,new()
    {

    }
    /// <summary>
    /// 要求泛型参数必须为引用类型
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Ameriacan<T> where T : class, new()
    {

    }
    /// <summary>
    /// 要求泛型参数必须为值类型
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class England<T> where T : struct
    {

    }
    /// <summary>
    /// 要求泛型参数必须实现接口IAnimal
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Animal<T> where T : IAnimal
    {

    }
    /// <summary>
    /// 多泛型参数示例
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="T1"></typeparam>
    public class Italy<T,T1> 
    where T:class
    where T1:struct
    {

    }

做架构的时候有一句经典的思想—-推迟一切能推迟的

版权声明:本文为博主原创文章,未经博主允许不得转载。

[.Net码农]MVC——入门+最简单的小实例

http://blog.csdn.net/suneqing/article/details/41427037?utm_source=tuicool&utm_medium=referral ...
  • CrackLibby
  • CrackLibby
  • 2015年11月19日 22:22
  • 1115

Java泛型的实现:原理与问题

很久没写博客了,因为项目和一些个人原因。最近复习找工作,看书+回想项目后有一些心得,加上博客停更这么长时间以来的积累,很是有些东西可写。从今儿开始,慢慢把之前积累的东西补上来,方便以后查漏补缺。 先...
  • yi_Afly
  • yi_Afly
  • 2016年07月23日 12:36
  • 6417

Java中三种简单注解介绍和代码实例

简单Java注解 JDK5提供的简单注解类型只有3个. 这三个都是用来预防错误或者进行提醒的,分别是: 1.Override 2.Deprecated 3.Suppresswarnings ...
  • xjbclz
  • xjbclz
  • 2016年09月25日 15:00
  • 1173

C#泛型学习和理解代码示例

  • 2014年01月10日 13:00
  • 40KB
  • 下载

NET反射的简单理解与代码示例

反射是.NetFrameWork提供给我们的一个帮助类库Reflection.dll 它可以动态加载、解析、使用dll 普通方法我们使用时项目中添加引用,然后实例化使用;反射基于“元数据”–met...
  • sunshineyang1205
  • sunshineyang1205
  • 2017年12月22日 10:23
  • 117

.net 中的泛型示例

  • 2008年10月10日 15:33
  • 43KB
  • 下载

java泛型边界深入探讨,示例代码

java泛型边界深入探讨,示例代码
  • liangrui1988
  • liangrui1988
  • 2014年06月04日 23:42
  • 886

ASP.NET通过反射获取泛型列表,从而节省代码量

在某些情况下,要返回某个数据库表中的数据,如要返回Customers中的数据,就要写一个return  List,如果有100张表的话,将会写100个这样的方法。 于是想到了使用List来作为数据的...
  • yoyoshaoye
  • yoyoshaoye
  • 2011年08月24日 23:43
  • 2206

简单来说一下java中的泛型,ssh中dao层使用会简化代码量

原来只是听老师说泛型特别好用,但是后来一直弄android用的泛型就比较少了,可是感觉它真的很重要,于是花了一下午的时间写了个demo,好,老规矩,上代码: 首先,sysout是个工具,但是用着不顺...
  • qq_23195583
  • qq_23195583
  • 2015年06月10日 08:12
  • 809

泛型让代码安全简单

合理的使用泛型,能让代码中的类型转换更加安全,而且在写代码的时候会更加简单。...
  • oDeviloo
  • oDeviloo
  • 2016年08月27日 16:50
  • 798
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NET中泛型的理解与简单代码示例
举报原因:
原因补充:

(最多只允许输入30个字)