泛型是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. scala调用fastjson JSON.toJSONString()序列化对象出错

    在scala中需要将case class 序列化为string,代码如下 results.map(JSON.toJSONString(_)).foreach(println) case class p ...

  2. [JSOI2014]宅男计划

    Description: 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第i种食物会在Si天后过期.JYY是不会吃过期食物的. 比如JYY如果今天点了一份保质期为1天 ...

  3. ZSTUOJ刷题⑩:Problem B.--零起点学算法103——查找最大元素

    Problem B: 零起点学算法103--查找最大元素 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 9951  Solved: 4793 Descri ...

  4. Leetcode本地阅读器开发--01界面设计三

    这篇文章主要写一下怎样实现定类别查找. 1 void Widget::on_comboBox_currentIndexChanged(int index) 2 { 3 QString sortname ...

  5. WSL2与ensp的40故障

    在使用ensp做radius认证的时候看到了Linux平台的freeradius认证服务器,于是使用了Windows平台的sub system: WSL2,按照网上的教程安装,并且安装了docker ...

  6. Ubuntu linux下gcc、g++不同版本的安装和切换

    讲解linux下gcc.g++不同版本的安装和切换 Ubuntu 18.04预装GCC版本为7.3,但有时在编译是需要用的不同gcc版本,下面介绍,如何安装不同的gcc 和g++,并设置根据不同的需要 ...

  7. Sky Full of Stars

    题目链接: luogu cf 题目大意: 给定一个 \(n \times n\) 的矩形,在里面填充三种颜色,求使得至少一行或至少一列同色的方案数. 解法 容斥 我们不去考虑反演,直接开始容斥,我们不 ...

  8. pandas的groupby.apply和直接apply效果是不一样的

    GroupBy.apply(func, *args, **kwargs)[source] Apply function func group-wise and combine the results ...

  9. Android studio的使用2

    运行按钮First activity: package com.example.activity;import androidx.appcompat.app.AppCompatActivity;imp ...

  10. Nginx 监听同一端口号配置多个域名

    同一台nginx服务器通过配置多个server块实现在同一端口号下监听多个域名. 需要注意的是:端口号(listen)+主机名(server_name) 需要在多个server中唯一,否则会报错. 实 ...