博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#泛型详解
阅读量:6810 次
发布时间:2019-06-26

本文共 2397 字,大约阅读时间需要 7 分钟。

泛型需要引用 System.Collections.Generic 命名空间

 

泛型的优势

   1.代码重用

   2.减少装箱拆箱操作,提高性能

   3.类型安全

   4.代码拓展

 

泛型方法

     1.不使用泛型

1         public void Show(int iValue) 2         { 3             Console.WriteLine("非泛型方法:{0}",iValue.GetType().Name); 4         } 5         public void Show(string sValue) 6         { 7             Console.WriteLine("非泛型方法:{0}", sValue.GetType().Name); 8         } 9         public void Show(DateTime dValue)10         {11             Console.WriteLine("非泛型方法:{0}", dValue.GetType().Name);12         }
View Code

   或者可以传入Object 值进行Show操作,但会增加装箱拆箱操作,导致性能损失

public void Show(object oValue)        {            Console.WriteLine("非泛型方法:{0}", oValue.GetType().Name);        }

 2.使用泛型

public void Show
(T t) { Console.WriteLine("泛型方法:{0}", t.GetType().Name); }

泛型延迟声明,在调用时在声明,可以很好的提高性能,减少装箱拆箱,调用如下

Show
(1); Show
("Test"); Show
(DateTime.Now);

泛型类,接口,委托

 泛型类的创建

public class MyGeneric
{ public void GenericClassShow() { Console.WriteLine(typeof(T).Name); } }

泛型接口的创建

public interface IMyGeneric
{ void Show(T t); }

泛型委托的创建

public delegate void Show
();

泛型约束

约束 说明
where T:struct 结构约束,类型T必须是值类型
where T:class 类型T必须是引用类型
where T:IFoo   类型T必须实现IFoo接口
where T:Foo    类型T必须派生自基类Foo
where T:new() 构造函数约束,类型T必须有一个默认构造函数
where T1:T2 类型T1派生自类型T2

 

 

 

 

  

 

 

public class MyGeneric
where T:class,new() { }

协变与逆变

只作用于泛型接口与泛型委托

先定义一个IPeople接口,People类以及基类Women 和子类Girl

public interface IPeople
{ public int Id { get; set; } } public class People
:IPeople
{ } public class Women { } public class Girl:Women { }

 

 

 

 

 

当 IPeople<Women> women = new People<Girl>();实例化一个women类的集合时就会报错,需要加入out关键字,表示返回类型只能是T

public interface IPeople
{ public int Id { get; set; } }

逆变同理in关键字表示传入的参数只能是T类型,这样就可以通过父类创建子类

public class MyGeneric
where T:class,new() { // IPeople
women = new People
(); IPeople
girl = new People
(); } public interface IPeople
{ public int Id { get; set; } }

 

转载于:https://www.cnblogs.com/sevenchen/p/7967878.html

你可能感兴趣的文章
一个Java架构进阶必修体系图(只要思想不滑坡,方法总比困难多) ...
查看>>
MySQL 是如何解决幻读的
查看>>
Some methods of deep learning and dimensionality reduction
查看>>
天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生 ...
查看>>
「镁客早报」高通称若没有苹果订单无需每年升级芯片;小米进行第二次回购 ...
查看>>
生产实践Kafka与ELK
查看>>
Eclipse的PropertiesEditor切换大小写
查看>>
Android多线程源码详解一:handler、looper、message、messageQueue
查看>>
SaaS加速器II 能力中心:互利互补 共享商业红利
查看>>
病毒木马防御与分析实战
查看>>
分布式工作流任务调度系统Easy Scheduler正式开源
查看>>
Flutter实战(一)写一个天气查询的APP
查看>>
Golang 入门系列(十) mysql数据库的使用
查看>>
Python零基础学习笔记(十二)—— 字符串及其常用方法
查看>>
数据脱敏平台-大数据时代的隐私保护利器
查看>>
区块链教程Fabric1.0源代码分析ledgerID数据库-兄弟连区块链教程
查看>>
轻松上云系列之二:其他云数据迁移至阿里云
查看>>
sql server 高可用性技术总结
查看>>
Robot Framework之分层测试流程
查看>>
学习ASP.NET Core Razor 编程系列七——修改列表页面
查看>>