什么是泛型

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

  • 比如我们需要一个方法支持传入多种类型的参数,我们可以有如下实现:
//方法1,int参数
public void Say(int a){
Console.WriteLine("Hello," + a);
}
//方法2,string参数
public void Say(string b){
Console.WriteLine("Hello," + b);
}

这样的代码有一个问题,那就是重复的代码太多。于是我们就想到了用一个Object来接收参数。

  • 用Object来接收参数
public void Say(object b){
Console.WriteLine("Hello," + b.ToString());
}

用Object来接收参数就涉及到了一个装箱和拆箱问题(引用类型和值类型的转换)

  • 最后我们使用泛型来优化
public void Say<T>(T t){
Console.WriteLine("Hello," + t.ToString());
}

说明:泛型其实就是延迟声明,推迟一切可以推迟的。

泛型在编译时才确定类型,会通过占位符来自动生成类。

泛型缓存

  • 常规方式,就是通过全局定义一个Diction,然后Diction的键就是类型,值就是该类型对应的值,如下:
Diction<Type,string> cache=new Diction<Type,string>();

这段代码很好理解,能够保证一个类型缓存一个值。

  • 泛型缓存

定义泛型缓存类

public class GenericCache<T> where T : class
{
public static string data = string.Empty; public static string getData()
{
return data;
}
}

使用

GenericCache<string>.data = "123456";
GenericCache<LogHelper>.data = "1234567";
Console.WriteLine(GenericCache<string>.getData());
Console.WriteLine(GenericCache<LogHelper>.getData());

参考文章:https://blog.csdn.net/dengblog/article/details/78884995

说明:泛型缓存效率高很多,但是只能根据类型缓存,有局限性。

泛型约束

我们习惯用一个T代表将要传入的类型,但是对于传入的类型却不清楚,如果让调用者任意传入类型肯定是不应该的,因此我们引入了泛型约束的概念,用于约定传入的类型必须满足某些条件才允许编译通过。

  • 值类型约束
class ValSample<T> where T : struct{}

其实我们可以看到int,char都是struct

  • 引用类型约束
class ValSample<T> where T : class{}
  • 接口/基类约束
class Sample<T> where T:Stream{}
  • 构造函数约束
public T CreateInstance<T>() where T:new()
{
return new T();
}
  • 组合约束
class Sample<T> where T:class,IDisposable,new()
class Sample<T,U> where T:struct where U:Class

参考文章:https://www.cnblogs.com/haibozhu/p/6374977.html

问题解答

WCF、WebService为什么不支持泛型

因为在服务发布的时候必须要确定类型。

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

  1. Java泛型学习---第二篇

    泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ...

  2. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

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

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

  4. java 泛型学习

    http://blog.csdn.net/archie2010/article/details/6232228 学习集合框架的时候经常用hasmap<Integer,Integer>就是泛 ...

  5. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  6. java泛型学习(2)

    一:深入泛型使用.主要是父类和子类存在泛型的demo /** * 父类为泛型类 * @author 尚晓飞 * @date 2014-7-15 下午7:31:25 * * * 父类和子类的泛型. * ...

  7. Java泛型学习--第一篇

    还是那句话,学习某个知识一定要想想为什么要学它,这方面的知识用来解决什么问题的,怎么用,并且要总结的体系化,不能散的到处都是,方便以后查看博客. 今天参考廖雪峰老师官网学习并总结下泛型廖老师官网 1. ...

  8. 【09-03】java泛型学习笔记

    静态方法的泛型 /** * @description 静态方法的泛型无法使用类定义的泛型,因为类在实例化时才确定具体的泛型类,因此静态方法要使用泛型需要使用泛型方法的方式 */ public clas ...

  9. 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)

    原文出处:http://www.cnblogs.com/xun126/archive/2011/01/13/1933838.html 泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵 ...

  10. Java泛型学习笔记 - (五)泛型接口

    所谓泛型接口, 类似于泛型类, 就是将泛型定义在接口上, 其格式如下: public interface 接口名<类型参数>如: interface Inter<T> { pu ...

随机推荐

  1. CentOS环境部署(Nginx+Mariadb+Java+Tomcat)

    1.安装nginx 安装 yum install nginx 启动 yum install nginx 开机自启 sudo systemctl enable nginx 2.安装mariadb 安装 ...

  2. 用vue开发一个所谓的数独

    1.前言 最近的后台管理系统页面,功能暂时没有新的需求,就在想首页放什么东西,最近我想到的就是放个所谓的数独,为什么是所谓的数独,因为规则不同于标准的数独,只要求每一行每一列数字不一样就可以了!这个实 ...

  3. Python之Linux命令

    1.查看当前文件路径  :  pwd LangYingdeMacBook-Pro:Users langying$ pwd /Users 2.切换目录 cd 例如:切换到根目录  : cd /   回到 ...

  4. BZOJ 3636 教义问答手册 (分治)

    题意 一个整数数列,多次询问某段区间[li,ri][l_i,r_i][li​,ri​]内,选出若干个长度为LLL且不相交的连续段使选出来的数和最大. 分析 首先想朴素的区间DPDPDP 设f[i][j ...

  5. P5541 [USACO19FEB]Sleepy Cow Herding

    ri,被黄题虐. 思路:贪心?? 提交:2次 错因:没有特判 题解: 先排序. 最小代价:固定区间长度为\(n\),我们扫一遍数组看区间最多包含几个数,设为 \(mx\) ,答案就是\(n-mx+1\ ...

  6. 008——MATLAB-xlswrite的使用方法

    (一)参考文献:https://blog.csdn.net/liangjiubujiu/article/details/80455753 以矩阵A=[1 2 3 4;5 6 7 8]为例进行介绍 例1 ...

  7. HTML怎么块外横向剧中

    HTML  块外横向剧中    在HTML中有一个块外横向剧中的代码  那就是margin:0 auto  这个能是块内元素横向剧中 剧中前: 剧中后

  8. Microsoft.Jet.OLEDB.4.0读取EXCEL数据

    用Microsoft.Jet.OLEDB.4.0读取EXCEL数据的代码是这样的:     string ConnStr="Provider=Microsoft.Jet.OLEDB.4.0; ...

  9. ros topic 命令

    #查看topic频率rostopic hz /xxx_imu_driver/imu #查看topic信息rostopic info /xxx_imu_driver/imu #查看topic数据rost ...

  10. hadoop namenode启动失败

    hadoop version=3.1.2 生产环境中,一台namenode节点突然挂掉了,,重新启动失败,日志如下: Info=-64%3A1391355681%3A1545175191847%3AC ...