泛型是C#中应用极为广泛的一种语法,本篇文章将详细介绍泛型的定义、使用、性能等。

一、什么是泛型

首先需要记住的是,泛型是.NET 2.0推出的语法,这样的话,泛型基本可以用于所有程序的开发,而不需要担心客户终端或者服务器上不支持的版本。

泛型将数据类型参数化,即数据类型作为一个参数来使用,等到运行时,根据不同的情况,为这个特殊的参数赋值。

二、为什么用泛型

我们现在模拟一个应用场景:在一个静态类中,有一个静态的字典类型的变量,变量的key、value类型均为string。

/// <summary>
/// 字典缓存类
/// </summary>
public static class DicCache
{
public static Dictionary<string, string> dicList = new Dictionary<string, string>();
}

我们需要往这个静态字段中,添加不同的值,但是我们不能保证value的类型均为string。

public void AddDicData()
{
DicCache.dicList.Add("1", "第一个值");
DicCache.dicList.Add("2", 2);
DicCache.dicList.Add("3", DateTime.Now);
}

这个时候,插入第二、三条的时候,就要报错了。

vs明确提示,数据类型不匹配。

上面我们提到,泛型是建数据类型参数化,这个时候,我们能不能将字典类型变量的value的类型,设置成一个参数,通过参数不同,保存不同类型的值?

改造之后的代码如下:

/// <summary>
/// 字典缓存类
/// </summary>
public static class DicCache<T>//泛型类
{
public static Dictionary<string, T> dicList = new Dictionary<string, T>();
}

代码中,在类DicCache后面添加“<T>”,则该类变成了一个泛型类。字典变量中,value的类型变成了“T”,则value的数据类型成为了一个可变的值。该类新的调用方法也变成了下面的样子。

调用该类的时候,在类名后,已“<>”包含实际的数据类型,提交给该类,则添加数据的时候,不报错了。

三、其它泛型的用法

泛型不仅包含泛型类,还包含泛型参数、泛型变量、泛型接口、泛型委托等。

    /// <summary>
/// 泛型的各种类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="S"></typeparam>
public class GenericityType<T, S>//包含多个泛型参数的类
{
public T TData;//泛型变量 public delegate void SayHello<S>(S s);//泛型委托
} /// <summary>
/// 泛型接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IGenericityType<T>//泛型接口
{
string SayHello(T t);//泛型参数 T RetT();//泛型返回值
}

四、泛型约束

泛型约束包含多种类型的约束,一般在比较大的一些项目或者比较严谨的项目中使用较多。

类约束

    /// <summary>
/// 类约束,约束T传入的类型必须是Test类型或者是Test的子类
/// </summary>
/// <typeparam name="T"></typeparam>
public class Company<T> where T:Test
{ }

  接口约束

    /// <summary>
/// 接口约束,约束T传入的类型必须是ITest类型
/// </summary>
/// <typeparam name="T"></typeparam>
public class Company<T> where T:ITest
{ }

  类型约束

    /// <summary>
/// 类型约束,约束T传入的必须是class类型的类型
/// </summary>
/// <typeparam name="T"></typeparam>
public class Company<T> where T: class
{ }

  多重约束

    /// <summary>
/// 多重约束,约束T传入的必须是class类型的类型或者是ITest接口或者是int类型
/// </summary>
/// <typeparam name="T"></typeparam>
public class Company<T> where T: class,ITest,int
{ }

五、泛型的原理

泛型是运用了延迟的设计思想,即在声明和编辑的时候,用一个占位符代替了数据类型,等到程序运行的时候,将占位符编译为传入的数据类型。延迟思想在实际项目中很受欢迎,我们再以后的笔记中体现。

六、泛型的性能

  泛型在性能方面,是优于固定类型的,这个大家有兴趣,可以自己做个for循环测试。

七、泛型的应用--缓存

  静态修饰符:static,被定义为静态的类,不管程序经过怎么样的运行,其在内存中,只存在一个,根据这个特性,我们可以自己做一个本地的缓存。

    /// <summary>
/// 字典缓存类
/// </summary>
public static class DicCache<T>//泛型类
{
private static Dictionary<string, T> dicList = new Dictionary<string, T>(); /// <summary>
/// 添加缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static string AddDic(string key, T value)
{
if (Exsits(key))
{
return "缓存数据已存在";
}
else
{
dicList.Add(key, value);
return "成功";
}
} /// <summary>
/// 获取缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static T GetDic(string key)
{
return (T)dicList[key];
} /// <summary>
/// 删除指定缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool DeleteDic(string key)
{
return dicList.Remove(key);
} /// <summary>
/// 删除所有缓存
/// </summary>
public static void DeleteAllDic()
{
dicList.Clear();
} /// <summary>
/// 判断缓存是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Exsits(string key)
{
return dicList.ContainsKey(key);
}
}

  缓存是一个大标题,系统优化中,缓存是不可缺少的一个环节,后期的笔记中,也会不断体现患者的其它实现方式。

八、特别说明

  本人是一个马上过期的码农,现在想把自己之前用到的一些知识点总结记录一下,有错误或遗漏,请大神指正。

C#笔记之泛型的更多相关文章

  1. TypeScript笔记[5]泛型+Dictionary 转

    TypeScript笔记[5]泛型   在C++.C#.Java等主流编程语言中,一般对泛型编程提供了支持.合理利用泛型,可以提高开发效率.提升代码质量. 例如在C++编程语言中,常常利用下面的结构表 ...

  2. 《CLR via C#》读书笔记 之 泛型

    第十二章 泛型 2014-06-15 初始泛型 12.3 泛型基础结构 12.3.1 开放类型与封闭类型 12.3.2 泛型类型和继承 12.3.3 泛型类型同一性 12.3.4 代码爆炸 12.6 ...

  3. .Net 笔记(二) 泛型和集合

    前言: 本文中介绍 泛型和集合的区别.也算是自己的一个知识点的回顾,并且把它们写在自己的笔记中. 1.集合: 在讲到集合之前,我们先来回顾下数组的知识点吧,因为集合和数组的关系也是比较微妙的各有利弊, ...

  4. 笔记-java泛型详解

    首先,先说明一下,java泛型文章的出处:http://www.cnblogs.com/lzq198754/p/5780426.html 作为学习笔记保存. 1.为什么需要泛型 泛型在Java中有很重 ...

  5. java学习笔记之泛型

    "泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...

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

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

  7. Java泛型学习笔记 - (一)泛型的介绍

    一.什么是泛型:泛型的作用是用来规定一个类, 接口或方法所能接受的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就 ...

  8. swift学习笔记之-泛型

    //泛型(Generics) import UIKit /*泛型(Generics):泛型代码可以让你编写适用自定义需求以及任意类型的灵活可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽 ...

  9. Effective Java 读书笔记之四 泛型

    泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型 ...

  10. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

随机推荐

  1. springsecurity 配置swagger

    最近在学习springsecurity 安全框架,具体是什么概念在这里不一一赘述了.下面呢,咱们一起搭建一下简单的springsecurity swagger 项目感受一下. 首先初始化spring ...

  2. noi 1.5 36 计算多项式的值

    描述 假定多项式的形式为xn+xn-1+-+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入 输入仅一行,包括x和n,用单个空格隔开.x在float范围内,n < ...

  3. JAVA中的变量与基本操作

  4. Jenkins项目中的Performance Trend图表不显示

    权限问题:chmod 777 /.../*.jtl 其中上述目录为jmeter生成jtl格式的结果报告的路径,也就是ant对应build.xml里配置好的路径.

  5. vs2013如何添加扩展库函数

    本文仅针对C和C++ vs2013下载C/C++编译器后,能够包含常见的头文件,stdlib.h,stdio.h,math.h这些.如果有其他需求例如:调用GL/glfw32.h,freeglut.h ...

  6. mysql查询mapper返参类型为List

    List<String> lists = mapper.select(); 返参类型为List,查询没有数据的时候,lists不会为null,lists.size() 为 0.

  7. Java 中的内存分配

    Java 中的内存分配 Java 程序运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 一.栈:储存局部变量 局部变量 ...

  8. nginx二进制安装脚本

    #!/bin/bash NGINX_FILE=nginx-1.22.0#NGINX_FILE=nginx-1.20.2#NGINX_FILE=nginx-1.18.0NGINX_URL=http:// ...

  9. 创建一个Openpyxl

    from openpyxl import Workbook wb = Workbook(r'C:\Users\yjiang3\Desktop\23.xlsx') ws = wb.active from ...

  10. Shell脚本实现模拟并发及并发数控制

    #!/bin/bash #by inmoonlight@163.com #下面的代码控制并发数.其实是利用令牌原理实现 #一个线程要运行,首先要拿到令牌在该代码中即read一行数据,读取不到就会暂停, ...