泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵活的类或方法,但该类或方法在编译期间不知道使用什么类,就得以Object类为基础.而Object在编译期间没有类型安全性,因此必须进行强制类型转换,同时,给值类型使用Object类会有性能损失.泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型.这就保证了类型安全性:如果某个类型不支持泛型类,编译器就会报错. 一.泛型有以下几个优点: 1)性能 对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时…
前言 本章节开始讲解泛型..Net从2.0开始支持泛型,泛型不仅是C#的一部分,也与IL代码紧密集成.所以C#中泛型的实现非常优雅.相对于C#,Java是后期引入的泛型,受限于最初的设计架构,就实现的比较别扭,遭到不少人的吐槽,比如"类型擦除"问题.使用C#还是幸福的. 使用泛型最典型的应用,可能是List<T>了,从List<T>我们可以看到,使用泛型最明显的优点是: 将List的功能和包含类T的功能分开,功能各自实现.使得代码内聚性.复用性.灵活性都更好.…
.NET自从2.0版本开始就支持泛型. 非泛型链表 闲话休提,马上来看下非泛型的简化链表类,它可以包含任意类型的对象. LinkedListNode.cs中: 在链表中,一个元素引用另一个元素,所以必须创建一个类,将其封装在链表中,并引用下一个对象. public class LinkedListNode { public LinkedListNode(object value) { this.Value = value; } public object Value { get; private…
前言 本篇继续讲解泛型.上一篇讲解了泛型类的创建.本篇讲解泛型类创建和使用的细节. 泛型类 上篇举了个我产品中用到的例子,本篇的功能可以对照着此案例进行理解. /// <summary> /// 单一事务处理服务,用于单表的数据读写事务 /// </summary> /// <typeparam name="TViewModel"></typeparam> /// <typeparam name="TEntity"…
为何引入泛型 当我们要对不同类型的参数执行类似的方法时:如下所示功能打印传入参数的相关信息. class CommonMethdod { /// <summary> /// show int /// </summary> public static void ShowParam(int iParam) { Console.WriteLine($"this is {typeof(CommonMethdod)},type={iParam.GetType().Name},par…
泛型类型约束 简言之:对泛型类型进行约束,细化,限定. MSDN的定义:泛型定义中的 where 子句指定对用作泛型类型.方法.委托或本地函数中类型参数的参数类型的约束,意思就是可以有泛型类.泛型方法.泛型委托或泛型接口四类[即where可以写在这4种后面]. 约束可指定接口.基类或要求泛型类型为引用.值或非托管类型. 它们声明类型参数必须具备的功能.意思就是where T,这个T类型参数可以是接口.基类.是引用类型.值类型或非托管类型. 下表列出了五种类型的约束: 约束 说明 T:struct…
为何引入协变.逆变 我们知道一个子类对象可以赋值给一个基类对象 Animal animal = new Animal(); Animal cat = new Cat(); 那如果是用在泛型里面能行嘛? List<Animal> animalsList = new List<Animal>();//pass List<Animal> CatsList = new List<Cat>();//error 一组猫难道不是一组动物吗?错,是因为这里List<A…
1.协变和抗变 泛型接口的协变 如果泛型类型用 out  关键字标注,泛型接口就是协变的.这也意味着返回类型只能是 T. 接口IIndex 与类型T 是协变的,并从一个制度索引器中返回这个类型. public interface IIndex<out T> { T this[int index]{ get; } int Count{ get; } }  如果对接口IIndex 使用了读写索引器,就把泛型类型T 传递给方法,并从方法中检索这个类型.这不能通过协变来实现—泛型类型必须定义为不变的.…
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的一个主要优点就是性能.对值类型使用非泛型集合类,在把值类型转化为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作. 下面的例子显示了System.Collections名称空间中的ArrayList类.ArrayList存储对象,Add()方法定义为需要把对象作为参数,所以要装箱一个整数…
前段时间工作比较忙,就没有写随笔了,现在继续. 前两天重新看了泛型和数组两章,简单说下我自己的收获吧 泛型 我们知道数组是一种批量的数据格式,而泛型其实就是一种自定义的批量数据格式,当数组和C#现有的泛型类List和Dictionary<K,V>不满足我们的要求时,我们可以自己创建泛型类,具体怎么创建就不在这里一一解释了,要创建时再去找解决方案吧(个人感觉完全没必要去纠结每一个功能如何实现,真要使用时可以去网上搜到大把的实现方式,我们只要知道有这样一种解决方案,可以实现这样一个功能就行). 泛…