泛型的作用和约定

提高性能

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

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

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. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  2. Fiddler抓取https方法

    基本配置 菜单 -> menu -> tool -> https 勾选"捕获https连接" 勾选"捕获https流量" 勾选"检查 ...

  3. CSS: inline、block和inline-block的区别

    block 块级元素特点: 1.每个块级元素都从新的一行开始,并且其后的元素也另起一行.(很霸道,一个块级元素独占一行) 2.元素的高度.宽度.行高以及顶和底边距都可设置. 3.元素宽度在不设置的情况 ...

  4. day03_2spring3

    SSH整合(续) 一.spring整合hibernate:有hibernate.cfg.xml 前提:导入jar包,在前面已经介绍了jar包的整合,我们只需要将整合的所有jar包导进去即可. 1.创建 ...

  5. C#继承是个啥

    继承: 字面意思就是继承 如地主老王有500亩地,老王的儿子小王可以种这五百亩地可以随便拿这五百亩地上面的任何东西 如Controller 你要用从一个controller调用另一个controlle ...

  6. vue.js 的cdn 链接的引用地址

    引用地址有两种一种完整版,一种压缩版效果是一样的 https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js https://cdn.bootcss.com ...

  7. PM2的参数配置

    https://github.com/jawil/blog/issues/7 配置项: name  应用进程名称:script  启动脚本路径:cwd  应用启动的路径,关于script与cwd的区别 ...

  8. 静态区间第k小 - 整体二分

    蒟蒻终于学会整体二分啦! 思路 实现 丑陋无比的代码 #include <bits/stdc++.h> using namespace std; const int N = 200005; ...

  9. Selenium3+python自动化009- 多选框

    多选框 # 随机选择多选框# sports=driver.find_elements_by_name("sport")# maxnum=len(sports)# num=rando ...

  10. ROS2GO 与WIN10 双系统安装

    关于ROS2GO的一些心得: 我是一个ROS的探索者,在接触ROS一段时间后,意外发现了一个关于ROS2GO的信息,是天之博特的微信公众号发表的.简单来说ROS2GO就是一个装了ROS的Ubuntu系 ...