首页 > 编程语言 >[个人笔记][C#]泛型

[个人笔记][C#]泛型

时间:2023-09-05 14:57:08浏览次数:70  
标签:C# 笔记 约束 类型 参数 协变 泛型 实参

  • 没有泛型时的问题
    • 用object实现的通用集合类型不安全,无法保证数据元素类型一致
    • 值类型会有额外的装箱拆箱开销
    • 类型特化的集合每有一个新类型就需要重新实现一遍
  • 泛型就是把类型作为参数,从而实现代码重用
  • C#的泛型在处理值类型的时候不会有装箱,节省性能和内存
  • 省去类型检查的性能开销
  • 相同泛型接口的不同构造被视为不同类型,一个类可以多次实现“同一个”泛型接口,虽然不建议,原因不知道没见过这种使用场景
  • 构造函数不要求类型参数
  • 可以用xxx = default提供任意类型的默认值
  • 仅类型参数个数不同的“相同”的类,应放到同一个C#文件中
  • 嵌套类型自动获得包容类型的类型参数,如果嵌套类型包含自己的类型参数T,会隐藏包容类型的类型参数T
  • 泛型约束可以约束基类,接口,类类型约束必须第一个出现,可以约束为Enum,Delegate和MulticastDelegate的子类
  • 可以约束为notnull,但不能与struct/class共同使用,因为后两个默认不可空
  • 约束为class时可以加个?表示约束为可空类型
  • struct不能在约束里写问号,但是可以在T后面写
  • new()构造函数约束,要求类型必须具有默认构造函数
  • 泛型类型参数和它们的约束不会被派生类继承,泛型类型参数不是成员
  • 派生类必须写自己的类型参数,加自己的约束,而且约束的严格性必须等同或更强于基类的约束,然后派生类的类型参数作为基类的类型实参
  • 重写虚泛型方法时约束隐式继承且不可以重新声明,额外的约束会破坏多态性,所以不允许新增约束,如果不会新增那自然默认可以继承约束就好了
  • 不能在约束之间指定OR关系

泛型方法

  • 在泛型类型和非泛型类型中都能声明泛型方法,泛型方法的类型实参可以自动推断,如果推断不准确,可以强转一下参数类型,或者指定类型实参
  • 允许使用和泛型类型的类型参数相同的方法指定约束
  • 协变逆变见另两篇
  • 协变转换的限制
    • 只有泛型接口和泛型委托可以协变,泛型类和结构永远不是协变的
    • 类型实参必须是引用类型,值类型不允许协变转换,因为值类型没有继承

标签:C#,笔记,约束,类型,参数,协变,泛型,实参
From: https://www.cnblogs.com/m1ds/p/17679525.html

相关文章

  • Flyweight Pattern —— Creational Class
    享元模式在主流的标准里是放到结构大类下的,但是我感觉这个模式的最终作用也是为了获取一个类,所以我将其划分到创建大类下。WhatisFlyweightPatternFlyweight是指轻量级的。享元模式旨在支持大量细粒度的对象共享,以减少内存消耗。该模式通过共享相似对象的部分状态,来减少对......
  • python用tkinter写一个文件对比的小工具,将两个excel文件进行对比,将两个列表差异保存到
    先写文件对比的逻辑代码,包括读取文件,对比文件,将对比出来的差异写入另一个excel文件1.读取文件,我这里是选取自己需要的不同的列,选定了指定的sheet列表,读者可根据需求更改defreadexcel(file):#打开Excel文件workbook=openpyxl.load_workbook(file)#选择指定......
  • O开放封闭原则OCP
    Open-ClosedPrinciple,OCP,对扩展开放,对修改关闭(设计模式的核心原则)定义一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭.意思是,在一个系统或者模块中,对于扩展是开放的,对于修改是关闭的,一个好的系统是在不修改源代码的情况下,可以扩展你的功能.而实现......
  • 基本操作系统学习笔记
    1、Vmware、OS简述1、虚拟机定义虚拟机(VirtualMachine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离的环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和......
  • 原生javascript实现拖拽
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content......
  • C++ 算法竞赛、01 周赛篇 | AcWing 第1场周赛
    AcWing第1场周赛竞赛-AcWing3577选择数字3577.选择数字-AcWing题库朴素暴力两层循环#include<cstdio>#include<iostream>#include<unordered_set>usingnamespacestd;constintN=101;inta[N],b[N];intmain(){intn,m;cin>>n;......
  • QT编译时qmake和cmake的区别
    qMakeQT+=coreguiQT缺省使用了core和gui库变量TARGET描述了目标文件的名称,即生成的应用程序的名字,默认采用工程文件所在的文件夹名字。变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件,有以下5种模板:应用程序app,为建立一个Qt应用程......
  • UOJ33 树上 GCD
    UOJ传送门设\(f_{u,i}\)为\(u\)子树内深度为\(i\)的点的个数,在\(\operatorname{LCA}\)处计算答案。但是时间复杂度无法接受。考虑长剖,计算答案只用枚举到轻链长,先对轻儿子做一遍\(\text{Dirichlet}\)后缀和,重儿子的信息直接继承上来。但是我们没法查询深度\(\bmod......
  • OpenHarmony Framework层开发笔记
    OH源码版本:OpenHarmony-v3.2-Beta52023.04.04由于需要裁剪系统APP,原本想法是在/applications/standard/hap/BUILD.gn增加一个part的但是最后发现vendor下有现成的裁剪APP的json配置文件,所以使用gitreset还原了/applications/standard/hap/仓库下的修改导致此仓库下的所有hap......
  • ORA-01501: CREATE DATABASE 失败ORA-01100: 数据库已装载(已解决)
    相信可能有很多用oracle数据库做项目数据库的同学们都多多少少有遇到这个错误。上网搜索的时候,大部分的答案都是需要在建库时加前缀“C##”,或者是修改可插拔数据库PDB的状态等。这些答案可能解决了大多数人的问题,但像我们本身使用多种类型数据库的人来说,习惯就容易让我们与正确答......