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

相关文章

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面