C#泛型学习
什么是泛型
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
- 比如我们需要一个方法支持传入多种类型的参数,我们可以有如下实现:
//方法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#泛型学习的更多相关文章
- Java泛型学习---第二篇
		泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ... 
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
		一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ... 
- Java泛型学习笔记 - (六)泛型的继承
		在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ... 
- java 泛型学习
		http://blog.csdn.net/archie2010/article/details/6232228 学习集合框架的时候经常用hasmap<Integer,Integer>就是泛 ... 
- Java泛型学习笔记--Java泛型和C#泛型比较学习(一)
		总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ... 
- java泛型学习(2)
		一:深入泛型使用.主要是父类和子类存在泛型的demo /** * 父类为泛型类 * @author 尚晓飞 * @date 2014-7-15 下午7:31:25 * * * 父类和子类的泛型. * ... 
- Java泛型学习--第一篇
		还是那句话,学习某个知识一定要想想为什么要学它,这方面的知识用来解决什么问题的,怎么用,并且要总结的体系化,不能散的到处都是,方便以后查看博客. 今天参考廖雪峰老师官网学习并总结下泛型廖老师官网 1. ... 
- 【09-03】java泛型学习笔记
		静态方法的泛型 /** * @description 静态方法的泛型无法使用类定义的泛型,因为类在实例化时才确定具体的泛型类,因此静态方法要使用泛型需要使用泛型方法的方式 */ public clas ... 
- 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
		原文出处:http://www.cnblogs.com/xun126/archive/2011/01/13/1933838.html 泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵 ... 
- Java泛型学习笔记 - (五)泛型接口
		所谓泛型接口, 类似于泛型类, 就是将泛型定义在接口上, 其格式如下: public interface 接口名<类型参数>如: interface Inter<T> { pu ... 
随机推荐
- 赤池信息准则AIC,BIC
			很多参数估计问题均采用似然函数作为目标函数,当训练数据足够多时,可以不断提高模型精度,但是以提高模型复杂度为代价的,同时带来一个机器学习中非常普遍的问题——过拟合.所以,模型选择问题在模型复杂度与模型 ... 
- js 面向对象之构造器与工厂函数
			字面量模式声明一个对象实例 let m = {name: "lisi", age:15} m.constructor // ƒ Object() { [native code] } ... 
- Git----基础常用的命令总结
			基础常规操作 git init git clone <版本库的网址> <本地目录名> touch xxx 本地创建一个xxx的文件 git add xxx git commit ... 
- Java中ClassLoader浅析.
			一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.lang; 2 3 public class Long { 4 public static void main(St ... 
- appium问题汇总(持续更新。。。)
			WEBVIEW_unknown adb版本较低,adb 1.0.32版本不支持安卓8.x版本,更新adb版本后正常 Install homebrew ruby -e "$(curl -fsS ... 
- php面向对象之$this->用法简述
			在成员方法中,调用成员方法的方法是对象名加方法名,格式就是“对象名->方法名”.但是在定义类的时候,我们往往不知道对象名是什么,所以就没法用对象名,这时,我们就要用到伪变量$this. 什么是$ ... 
- Postgresql vacuum freeze相关参数
			先看3个参数:autovacuum_freeze_max_age | 500000vacuum_freeze_min_age | 10vacuum_fr ... 
- Greenplum 调优--数据倾斜排查(二)
			上次有个朋友咨询我一个GP数据倾斜的问题,他说查看gp_toolkit.gp_skew_coefficients表时花费了20-30分钟左右才出来结果,后来指导他分析原因并给出其他方案来查看数据倾斜. ... 
- 【算法】变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂的解析
			更多精彩尽在微信公众号[程序猿声] 变邻域搜索算法(Variable Neighborhood Search,VNS)一看就懂的解析 00 目录 局部搜索再次科普 变邻域搜索 造轮子写代码 01 局部 ... 
- centos7 安装 mysql5.6(MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar)
			1.卸载MariaDB rpm -qa | grep -i mariadb rpm -e --nodeps mariadb-libs--.el7.x86_64 2.卸载已有Mysql 卸载旧版本mys ... 
