• 【从头构筑C#知识体系】2.1 泛型


    【系列文章目录】



    前言

    本篇介绍泛型

    【C#文档——泛型】


    一、什么是泛型

    泛型将类型参数的概念引入 .NET,这样就可设计具有以下特征的类和方法:在客户端代码声明并初始化这些类或方法之前,这些类或方法会延迟指定一个或多个类型。
    泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。

    在C#1.0中的冗长代码因为泛型而大大的改善
    泛型可以在设计一个类或方法时,将类型作为参数来传入
    提高了代码的复用性、安全性并且还提高了性能
    这些也是泛型的特点

    • 代码复用性
      泛型类定义一次,可以用类型参数来做不同的实例化操作
      例如List在实例化的时候指定类型,就可以实例化为只包含T类型的List
    • 安全性
      如果在ArrayList类中添加一个整数、一个字符串、一个类实例化出来的对象
      这个时候使用Foreach语句迭代并转换为Int就会出现异常
      而泛型很好的解决了这个问题
      例如在List中,使用List的定义,能被放入List中的就只能是int类型
    • 提高性能
      泛型并不是在使用对象,而是使用定义类型
      例如当List的泛型类型定义为int
      int类型在JIT编译器动态生成的类中使用
      不需要再进行装箱和拆箱操作
      (从值类型转换为引用类型称为装箱,从引用类型转换为值类型称为拆箱)

    二、泛型约束

    在使用泛型的时候我们还可以为泛型添加约束来进行设计
    泛型约束就是使用where来添加约束条件的的

    public class Singleton<T> where T : Singleton<T>{
    	//...
    }
    
    • 1
    • 2
    • 3

    这是一个单例基类的泛型约束写法
    在我们使用继承来定义一个单例类的时候
    可以保证Singleton中传入的T是继承了Singleton的

    三、泛型使用

    在实际使用中,如果不是设计底层逻辑或者要做框架和库
    只是写一些逻辑层和UI层的话
    基本上掌握ListDictionary 这些API的使用也就够了

    但是如果要做框架和库或者做一些通用的底层逻辑
    掌握泛型来做API就必不可少了
    通常我们需要设计的泛型API有:

    • 泛型接口
      public interface Base<T> where T : Base<T>   
      {     
          T Value { get; set; }   
      }    
      
      • 1
      • 2
      • 3
      • 4
    • 泛型类
      public class Singleton<T> where T : Singleton<T>
      {
      	//...
      }
      
      • 1
      • 2
      • 3
      • 4
    • 泛型方法
      public void Fun<T>(T args) where T: struct
      {
      	Debug.Log(args);
      }
      
      • 1
      • 2
      • 3
      • 4
    • 泛型委托
      public delegate void dele<T>(T args);
      
      • 1

    而他们可以与泛型反射配合使用

    • 泛型的反射
      var type = typeof(T);
      
      • 1

  • 相关阅读:
    信息系统项目管理-IT治理与IT审计
    Linux tar命令最佳实践《Linux零基础实战》
    2023天津科技大学计算机考研信息汇总
    gitlab之cicd的gitlab-runner集成-dockerfile构建环境
    确保第三方 API 安全的 5 个最佳实践
    Java常见ID生成方式比较
    html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面
    泛积木-低代码 使用攻略
    Java面试:Spring框架功能分为哪些模块?
    快递100使用
  • 原文地址:https://blog.csdn.net/ruanlinxi1994/article/details/125513686