24.3.1 《CLR via C#》 笔记9

2024-03-02 00:12
文章标签 c# 笔记 .net netcore via clr 24.3

本文主要是介绍24.3.1 《CLR via C#》 笔记9,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十二章 泛型

  1. 泛型:支持泛型值类型、泛型引用类型、泛型接口、泛型委托;允许在引用类型、值类型和接口中定义泛型方法;泛型参数变量要么称为T,要么以T开头

  2. 具有泛型类型参数的类型称为开放类型,不允许构造实例;当为所有参数类型传递了实际参数,类型就称为封闭类型,允许构造实例

  3. 泛型类型是类型,所以可以从其他类型派生;使用泛型类型并指定形参时,实际是定义一个新的类型(从泛型类型派生自的类型派生)。例:List<T>派生自Object,所以List<string>也派生自Object

  4. 泛型的同一性(不想让符号<>降低可读性时的处理)

    1. 使用class dtl : List<DateTime>,会失去同一性(typeof(dtl) != typeof( List<DateTime>))
    2. 可以使用 using dtl = System.Collections.Generic.List<DateTime>
    3. 可以直接var dtl = new List<DateTime>
  5. 代码爆炸(CLR每新出现一种类型的实参都要编译一次代码)

    1. 不同程序集中同一类型只编译一次(限定同一个domain)
    2. 所有引用类型都视为同一种实参(所有引用类型只编译一次)
  6. 可以定义泛型接口,如IEnumerator<T>

  7. 可以定义泛型委托,如Action<T>

  8. 泛型类型参数的逆变和协变

    1. 逆变性:用in关键字标记的泛型参数,可以更改为它的派生类(输入)

    2. 协变性:用out关键字标记的泛型参数,可以更改为它的基类(输出)

    3. 例:定义public delegate TResult Func<in T, out TResult>(T arg);

      Func<Object, ArgumentException> fn1 = null,

      Func<String, Exception> fn2 = fn1 是合法的(因为String从Object派生,Exception是ArgumentException的基类)

      使用:Exception e = fn2(" ") ; (实参String->Object, 返回值ArgumentException->Exception)

    4. 委托和接口都可以将类型参数标记为逆变量和协变量

  9. 泛型方法,定义泛型类、结构或接口时,类中定义的方法可以使用类指定的类型参数

    例:定义了class SomeClass<T>, 类中的方法可以使用类指定的T,如定义public T SomeMethod<T>()

  10. 由于out/ref实参传递的变量必须具有与方法参数相同的类型,所以可以使用泛型实现。

    例:private static void Swap<T>(ref T o1, ref T o2);

  11. C#编译器在调用泛型方法时可以进行类型推断,在可以确定类型实参的情况下可以不用<>指定

  12. 属性、索引器、事件、操作符方法、构造器、终结器本身不能有类型参数,但是可以在泛型类中定义,从而使用泛型类的类型参数

  13. 泛型可验证性:编译代码时需要确定代码适用于当前或已有或将来可能定义的任何类型,比如调用T.ToString(),对所有类型都有ToString()方法,所以代码合法

  14. 使用where关键字指定约束

    1. 约束可以应用于泛型类和泛型方法,不能用于重载(不能基于类型参数名称或约束重载,也不允许为重写方法的类型指定约束)
    2. 主要约束:主要约束指非密封类的一个引用类型(不包括Object, Array, Delegate, MulticastDelegate, ValueType, Enum, Void),能有零个或一个
    3. 特殊主要约束:class,指引用类型;struct,指值类型
    4. 次要约束:指接口类型,能有零个或多个
    5. 构造器约束:指拥有公共无参构造器的非抽象类型
  15. 其他可验证性问题

    1. 不能将泛型变量转型为其他变量(除非转成与约束兼容的类型)
    2. 不能将泛型变量设为null(除非泛型类型被约束成引用类型)
    3. 可以将泛型类型变量与null比较(==或!=),(虽然值类型不能与null比较(因为永远不会null),但是约束成值类型后,代码能通过编译,但不执行if逻辑,只生成永远为true的分支的代码)
    4. 同一泛型类型的两个变量,如果不能肯定是引用类型,则不能比较(T a,b;判断 a==b)
    5. 不能将操作符(+、-、*、/)用于泛型变量(不能编译)

这篇关于24.3.1 《CLR via C#》 笔记9的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764299

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓