泛型的作用和约定

提高性能

拆箱和装箱 从值类型转换为引用类型为装箱,把引用类型转换为值类型为拆箱

装箱和拆箱很容易使用,但是性能损失比较大,尤其是遍历许多项的时候。

List<T>不使用对象,在使用时定义类型

var list = new List<int>();
list.Add(44); // no boxing int item = list[0]; // mo unboxing

不妨将List<T>看做一种新的类型,不在特意的和C++的模板相比较;

泛型类型的命名约定

  1. 泛型类型的名称用T作为前缀;

  2. 泛型类型允许使用任意类替代,且只使用了一个泛型类型就可以用T作为泛型类型的名称

     public class List<T>{}
    public class LinkedList<T>{}
  3. 若泛型类型有特定需求(例如必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型

    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
    
    public delegate TOutput Converter<TInput, TOutput>(TInput from);
    
    public class SOrtedList<TKey, TValue>{}

泛型类的功能

默认值

创建泛型时,不能把null赋予泛型类型 ;在这个时候,我们就需要default,将null赋予引用类型,0赋值于值类型;

    public T GetDocument()
{
T doc = default(T);
lock(this)
{
doc = documentQueue.Dequeue();
} return doc;
}

约束

若泛型类需要调用泛型类型中的方法,就必须添加约束where

泛型支持以下几种约束类型:

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

泛型类型也可以合并多个约束,where T: IFoo, new()约束和MyMerge<T>申明指定,T必须实现IFoo接口,且必须有一个默认构造函数,示例如下所示:

    public class MyMerge<T> where T: IFoo, new()
{
// dosomething
}

继承

泛型类型可以实现泛型接口,也可以派生自类,当然也可以派生自泛型基类;

public class Base<T>{}

public class Derived<T>: Base<T> {}    // 派生自泛型基类

当然,泛型类型派生自指定基类的类型:

public class Base<T>{}

public class Derived<T>: Base<string>{}

静态成员

泛型类的静态成员只能在类的一个实例中共享

// 定一个泛型类的静态成员
public class StaticDemo<T>
{
public static int x;
} StaticDemo<int>.x = 3; // 第一组静态字段 = 3
StaticDemo<string>.x = 4; // 第二组静态字段 = 4 Console.WriteLine(StaticDemo<int>.x); // 这里将会输出3

泛型接口

使用泛型可以定义接口,在接口定义的方法可以带泛型参数

协变

在.Net中,参数类型是协变

例如,有Shape和Circle类,Circle派生自Shape,Display方法是为了接受Shape类型的参数

public void Display(Shape object){}

现在可以传递派生自Shape基类的任意对象,例如Circle,Rectangle

Circle c = new Circle(5);
Display(c); // 这里便是协变

抗变

方法的返回类型是抗变

例如,若方法返回一个Shape,就不能把它赋予Circle,但是反过来就可以;

泛型接口的协变

若泛型类型使用out标注,泛型接口就是协变的,意味着返回类型也是T

若泛型类型使用in标注,泛型接口就是抗变的,表明传入的参数类型只能是T

C#学习笔记之泛型的更多相关文章

  1. Java泛型学习笔记 - (六)泛型的继承

    在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...

  2. C#学习笔记:泛型委托Action<T>和Fun<TResult>

    转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类 ...

  3. iOS学习笔记(01) - 泛型

    决定新开一坑,在不断学习的同时分享自己的学习历程给大家,既是对自己学习的记录,又希望能对大家提供些微的帮助. 这一篇文章主要来介绍泛型的意义.使用与声明方法等. 1.泛型:限制类型 1.1.泛型使用场 ...

  4. java学习笔记之泛型

    "泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...

  5. Java泛型学习笔记 - (一)泛型的介绍

    一.什么是泛型:泛型的作用是用来规定一个类, 接口或方法所能接受的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就 ...

  6. swift学习笔记之-泛型

    //泛型(Generics) import UIKit /*泛型(Generics):泛型代码可以让你编写适用自定义需求以及任意类型的灵活可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽 ...

  7. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

  8. 【原】Java学习笔记027 - 泛型

    package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...

  9. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

随机推荐

  1. unserialize():Error at offset 0 of 96 bytes是什么意思

    数据库有个列是数组序列化后存到数据库的,取出来得反序列化, php想要把数组保存到数据库里,有两种序列化方式,分别是: //php系统序列化 $b = serialize($a);    //序列化数 ...

  2. Java体系结构

    java程序运行过程图 文章中内容大多来自该处Java虚拟机规范----JVM体系结构 - Java初级码农 - 博客园 JDK体系 JDK体系结构图 JDK.JRE.JVM之间的关系 JDK:Jav ...

  3. HTML连载64-a标签伪类选择器的注意点与练习

    一.a标签的伪类选择器注意点 (1)a标签的伪类选择器可以单独出现,也可以一起出现.也就是可以设置多个状态的样式. (2) a标签的伪类选择器如果一起出现,那么有严格的顺序要求,编写的顺序必须要遵守原 ...

  4. 【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库Sysbench测试最佳实践

    引言 作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况.本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法. ​ sysbench简介 什么是 ...

  5. 题解【AcWing10】有依赖的背包问题

    题面 树形 DP 的经典问题. 我们设 \(dp_{i,j}\) 表示当前节点为 \(i\),当前节点的子树(包含当前节点)最多装的体积是 \(j\) 的最大价值. 我们遍历节点的过程就相当于做了一遍 ...

  6. Jmeter-简介及安装

    一.Jmeter简介 Apache Jmeter 是Apache组织的开放源代码项目,是一个纯java桌面应用,用于压力测试和性能测量.它最初被设计用于Web应用测试但后来扩展到其它测试领域. Apa ...

  7. Codeforces Round #601 (Div. 2) A Changing Volume

    好吧,其实我拿到这个题的时候,首先想到了bfs,写完之后,开开森森的去交代码,却在第二个数据就TEL,然后优化半天,还是不行. 最终,我盯着1,2,5发呆半天,wc,然后直接贪心 #include&l ...

  8. Python七夕记

  9. JASON

    JSON 数据格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人 ...

  10. Python JASON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. http://www.runoob.com/python/python-json.ht ...