什么是泛型

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

  • 比如我们需要一个方法支持传入多种类型的参数,我们可以有如下实现:
//方法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. 并发编程:Thread和Runable-01

      1.继承Thread类(不推荐) 代码很简单,就不说了 public class ThreadTest02 { public static void main(String[] args) { n ...

  2. qsort中的函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...

  3. 洛谷P2661 信息传递【并查集】

    题目:https://www.luogu.org/problemnew/show/P2661 题意: 有一个有向图,问最小环的的大小. 思路: 明明是图的遍历,但是bfs会T.第二组下下来的数据n居然 ...

  4. python pip获取所有已安装的第三包

    pip freeze > requirements.txt # 生成txt 文件 pip install -r requirements.txt # 别人使用时可以直接安装所有的包 [progr ...

  5. struts--CRUD优化(图片上传)

    1.上传方式 上传到指定文件目录,添加服务器与真实目录的映射关系,从而解耦上传文件与tomcat的关系  文件服务器 2.web代码优化 package com.yuan.crud.web; impo ...

  6. neo4j查询语句

    一:查询 比较操作: = <> < > <= >= 布尔操作: AND OR NOT XOR 1.把节点的前两个字为"提示"的节点去除" ...

  7. Neo4j 在Linux下的安装登录

    第一步:安装JDK https://blog.csdn.net/qq_33951308/article/details/82933535 第二步:下载并安装neo4j 下载地址   或者直接用wget ...

  8. Postgresql vacuum freeze相关参数

    先看3个参数:autovacuum_freeze_max_age           | 500000vacuum_freeze_min_age               | 10vacuum_fr ...

  9. 上传1T文件

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...

  10. visual studio2015窗体中控件的属性中文说明不见了

    右击属性窗口,然后选中好说明就ok了.