什么是泛型

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

  • 比如我们需要一个方法支持传入多种类型的参数,我们可以有如下实现:
//方法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. Linq 中 Join 的用法

    Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.各个用法如下. 注:本文内容主要来自<Linq实战>,本例中用到的对象请见文章底部. 1. 组连接 组连接是与分组查询是一样的. ...

  2. 【图文教程】Vmware Workstation 12虚拟机中安装CentOS 7详细步骤

    文档维护人:牛棚琐思 <viprs@qq.com> ,如有不妥之处,请不吝赐教. 文档目标:帮助新手在Vmware虚拟机软件中安装CentOS 7超详细教程. 目标人群:本篇教程比较简单, ...

  3. python 查询每周最后一个工作日

    背景: 做定时任务时,一般都是写死每周五XXXXX,但有时遇到节假日的情况,周五可能不是本周最后一个工作日 代码如下: import urllib2,datetime,json nowTime = d ...

  4. 源码安装缺少configure文件

    源代码中没有configure的软件安装方法 今天下载了一个旧版的GeoIP软件包,解压以后发现代码包中没有configure文件,现在这这里记录一下安装遇到的问题 网上大部分GeoIP下载地址已经失 ...

  5. python_面向对象——反射

    1.反射 四个方法:getattr() 获取 class Person(): def __init__(self,name,age): self.name = name self.age = age ...

  6. 0、Python学习路线

    阶段一.Python语言(熟练掌握Python多线程并发编程技术,可以编写爬虫程序和语音识别软件.) 1.1 基础语法 1.1.1 python概述     1.1.2 数据的存储     1.1.3 ...

  7. Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别

    git pull 相当于自动的 fetch 和 merge 操作,会试图自动将远程库合并入本地库,在有冲突时再要求手动合并. git rebase 可以确保生产分支commit是一个线性结构,方便ro ...

  8. mac上安装Nginx详细教程

    1. 安装(可以用 brew 安装) sudo brew install nginx 2. 查看 nginx 版本 nginx -v 3. 启动 nginx sudo nginx 1也可以使用下面的命 ...

  9. 使用JSP/Servlet技术开发新闻发布系统---Servlet基础

    Servlet简介 什么是Servlet 其实就是一个类,主要负责处理用户的请求和做到数据的相应以及页面的跳转,基于Java技术的Web组件 Servlet API Servlet接口 Servlet ...

  10. HTML5中table标签与form标签的区别

    html中form表示一个表单,用来把一系列的控件包围起来,然后再统一发送这些数据到目标,比如最常见的注册,你说需要填写的资料,都是被封装在form里的,填写完毕后,提交form内的内容,如果不再fo ...