C#笔记之泛型
泛型是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#笔记之泛型的更多相关文章
- TypeScript笔记[5]泛型+Dictionary 转
TypeScript笔记[5]泛型 在C++.C#.Java等主流编程语言中,一般对泛型编程提供了支持.合理利用泛型,可以提高开发效率.提升代码质量. 例如在C++编程语言中,常常利用下面的结构表 ...
- 《CLR via C#》读书笔记 之 泛型
第十二章 泛型 2014-06-15 初始泛型 12.3 泛型基础结构 12.3.1 开放类型与封闭类型 12.3.2 泛型类型和继承 12.3.3 泛型类型同一性 12.3.4 代码爆炸 12.6 ...
- .Net 笔记(二) 泛型和集合
前言: 本文中介绍 泛型和集合的区别.也算是自己的一个知识点的回顾,并且把它们写在自己的笔记中. 1.集合: 在讲到集合之前,我们先来回顾下数组的知识点吧,因为集合和数组的关系也是比较微妙的各有利弊, ...
- 笔记-java泛型详解
首先,先说明一下,java泛型文章的出处:http://www.cnblogs.com/lzq198754/p/5780426.html 作为学习笔记保存. 1.为什么需要泛型 泛型在Java中有很重 ...
- java学习笔记之泛型
"泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...
- Java泛型学习笔记 - (六)泛型的继承
在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...
- Java泛型学习笔记 - (一)泛型的介绍
一.什么是泛型:泛型的作用是用来规定一个类, 接口或方法所能接受的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就 ...
- swift学习笔记之-泛型
//泛型(Generics) import UIKit /*泛型(Generics):泛型代码可以让你编写适用自定义需求以及任意类型的灵活可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽 ...
- Effective Java 读书笔记之四 泛型
泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型 ...
- 【Java学习笔记】泛型
泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...
随机推荐
- php处理mysql的结果集
Php使用mysqli_result类处理结果集有以下几种方法 fetch_all() 抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集. fetch_array() 以一个 ...
- wx小程序 组件无法使用全局样式 (app.wxss)
解决方法: 在组件中加上options选项 Component({ options: { addGlobalClass: true } })
- HTML初体验之各种标签练习
HTML初体验之各种标签练习 首先是<!DOCTYPE>标签 放在网页顶部的doctype声明是让浏览器进入正确呈现模式的关键.浏览器自动切换到恰当的呈现模式,以便正确显示由doctype ...
- HTML复习(17.表格样式)
重点 掌握caption-side(表格标题位置) 掌握border-collapse(表格边框合并) 掌握border-spacing(表格边框间距) 表格标题位置在CSS中,我们可以使用capti ...
- Dom,Bom的用法
DOM DOM 全称document object model 文档对象模型 操作HTML HTML文档有HTML+css组成 DOM 利用js操作HTML+css的 操作元素节点 element E ...
- c++ read and save txt
read and save #include "util/image_util.h" #ifdef USE_PANGOLIN_VIEWER #include "pango ...
- python3GUI--用Tk开发一款恶搞蓝屏软件(附源码)
目录 一.准备工作 1.Tkinter 2.科普-电脑蓝屏 二.预览 1.蓝屏-win10.win11(中文版) 2.蓝屏-win10.win11(英文版) 3.Windows其他版本(XP.Win7 ...
- Python3网络爬虫--爬取有声小说(附源码)
目录 一.目标 1.首页 2.网页源代码 二.爬取详情页 1.查看详情页 2.小说详情 3.小说简介 4.播放列表 三.爬取小说音频 1.确定数据加载方式 2.寻找真实音频播放地址 3.URL解码 4 ...
- git commit --amend适用场景详解
适用场景: 场景1.本地开发代码已提交,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时,希望达到以下目的: ①修改有问题的代码. ②补足漏提交的文件(一般是新增的文件没有git add . ...
- Visual Studio快速清除程序中的空行 删除空行
Ctrl+H; 正则替换 ^(?([^\r\n])\s)*\r?$\r?\n 快速删除多个空行