NET CLR via C#读书笔记 - 第十二章 泛型

《CLR via C#》学习笔记【1】 一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Common Language Runtime, CLR)是一个由多种编程语言使用的“运行时”。CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 事实上在运行 阅读详情

1 泛型简介

  泛型是另一种形式的“代码重用”,或者说“算法重用”。开发者可以定义好算法,排序,搜索,交换等,但是这些算法的数据类型却不会事先指定,而是由使用者去决定,一个排序算法可以操作int和string等类型对象。
  CLR允许创建泛型引用类型和泛型值类型,不允许创建泛型枚举类型。CLR允许在引用类型,值类型或者接口中定义泛型方法。
  使用泛型的优点有一下几点:
  ① 源代码保护,使用泛型的开发人员不需要知道泛型的具体实现,只需要知道相关定义即可,C++模板的泛型技术必须公开源代码。
  ② 类型安全,试图使用不兼容类型的对象会造成编译时错误,或者运行时异常。
  ③ 清晰的代码逻辑,由于编译器的强制类型安全性,不需要在代码使用强制装换指明转换类型
  ④ 性能优势,泛型算法相比于常规化算法,用来值类型的实例时会进行装箱操作,在数据量较大时,会比较严重的损耗性能,使用泛型算法时,所有值类型以传值的方式进行传递,不会造成装箱操作。

2 开放类型和封闭类型

  开放类型:具有泛型类型参数的类型,CLR禁止创建开放类型的实例。当所有类型参数都传递了实际类型参数时就成了封闭类型,可以创建封闭类型的实例。
  为泛型类型的泛型类型参数指定具体类型时,CLR会在内部创建创建该具体类型对象的内部数据结构,且每个封闭类型都有自己独立的静态字段,举个例子,加入List中定义了任意一个静态字段,但是在List定义的静态字段不会在List和List中共享,他们是相互独立的,静态构造器也是同样的规则,针对List和List会分别执行它们自己的静态构造器。

3 泛型类型和继承

  泛型类型也是类型,所以也可以从其它类型派生。
  例如List从object派生,那么List和List也从object派生。
  假如直接定义以下这个链表节点类型:

internal sealed class NODE<T> 
{
     public T m_data;
     public NODE<T> m_next;
     
     public NODE(T data) : this(data, null) { }
     public NODE(T data, NODE<T> next)
     {
         this.m_data = data;
         this.m_next = next;
     }

     public override string ToString()
     {
         return m_data.ToString() + ((m_next != null) ? m_next.ToString():string.Empty);
     }

 }

  调用代码如下:

NODE<char> head = new NODE<char>('C');
head = new NODE<char>('B', head);
head = new NODE<char>('A', head);
Console.WriteLine(head.ToString());

  输出结果:

  在以上这个示例中,所有的数据节点的类型在使用时是确定的,不能同时存储int和char这两种类型。
  那如果需要同时存储多种数据类型的链表可以如何实现呢?
  方法一:可以使用非泛型方法NODE,不过这种方法会导致编译时的类型安全丢失,而且值类型会频繁装箱。
  方法二:定义非泛型NODE基类,在定义泛型GNODE类。具体实现如下:

internal class NODE
{
    protected NODE m_next;
    public NODE(NODE next)
    {
        m_next = next;
    }
}

internal sealed class GNODE<T> : NODE
{
    public T m_data;

    public GNODE(T data) : this(data, null) { }

    public GNODE(T data,NODE next) : base(next)
    {
        m_data = data;
    }

    public override string ToString()
    {
        return m_data.ToString() + ((m_next != null) ? m_next.ToString() : string.Empty);
    }
}

  调用如下:

NODE ghead = new GNODE<char>('.');
ghead = new GNODE<int>(20210926, ghead);
ghead = new GNODE<string>("Today is ", ghead);
Console.WriteLine(ghead.ToString());

  输出结果(ABC为第一种方式输出结果):
在这里插入图片描述

4 泛型类型同一性

  使用using简化写法而不要使用新增类定义来简化代码,新增类会导致同一性丢失,具体看如下代码:
  新增类定义:

internal sealed class IntList : List<int>{}
IntList iT = new IntList();
bool sameType = (typeof(List<int>) == typeof(IntList ))

  运行结果 sameType 为 false
  使用using语法:

using IntList = System.Collections.Generic.List<int>;
bool sameType = (typeof(List<int>) == typeof(IntList ))

  运行结果 sameType 为 true

5 可验证性和约束

5.1 主要约束

  泛型类型参数可以指定0或者多个主要约束,主要约束是代表非密封类的一个引用类型,不能指定为System.Object,System.Array,System.Delegate,System.MulticastDelegate,System.ValueType,System.Enum,System…Void.指定主要约束后,相当于向编译器承诺,后续指定的类型实参要么是约束类型,要么是约束类型的派生类型,语法如下:

internal sealed class Test<T> where T : Stream{
	public void M(T stream){
		stream.Close();
	}
}

class 和 struct 是两个特殊的主要约束,class表明实参必须是引用类型,struct表明泛型实参指定时要为引用类型。

5.2 次要约束

  次要约束可以有0个或者多个,次要类型有接口类型约束和类型参数约束两种,接口类型约束在第十三章中展开,类型参数约束是规定了泛型类型的指定实参,要么就是约束类型,要么就是约束类型的派生类型。代码如下:

private static List<TBase> ConvertList<T,TBase>(IList<T> list) where T : TBase{
	List<TBase> baseList = new List<TBase>(list.Count);
	for(int index = 0;index < list.Count; index++)
	{
		baseList.Add(List[index]);
	}
	return baseList;
}

  ConvertList指定了两个类型参数,其中T为TBase的类型参数约束,T指定的任何类型实参都必须兼容于TBase指定的类型实参。

5.3 构造器约束

  构造器约束可以有0个或者多个,泛型类型指定的类型实参实现了公共无参构造器的非抽象类型。

class TestCtor<T> where T : new(){
	public static T Factory() {
		return new T();
	}
}

5.4 泛型类型变量转型

  将泛型类型的变量转型为其它类型(与约束类型不兼容的)是非法的。

5.5 泛型类型变量设为默认值

  使用default 关键字

class TestCtor<T>(){
	T temp = default(T);
}

5.5 泛型类型变量与null比较

  无论泛型是否被约束,使用==或者!= 操作符与null作比较都是合法的。

5.6 两个泛型变量作比较

  如果两个泛型变量是引用类型,是合法的,如果是都为值类型,如果没有重载==或者!=操作符,则是非法的。

5.7 不要将泛型类型变量作为操作数使用

  编译器在编译时确定不了类型,不能向泛型类型的变量应用任何操作符。

  以上内容为对《NET CLR via C#(第四版)》第十二章内容的阅读笔记,只记录其中核心部分内容,书中对以上主题还进行详细的代码演示说明,书中还讨论了泛型接口和泛型委托,如有需要,请详细阅读本书第十二章内容,感谢您的阅读。

CLR via C#: 4th Edition with Full Table of Contents CLR是.NET平台的运行时引擎,它负责管理代码的执行,提供了诸如内存管理、线程同步、异常处理等运行时服务。CLR使得.NET支持的编程语言可以在相同的虚拟环境中运行,而与底层操作系统和硬件平台无关。这种特性使得.NET应用程序具有良好的可移植性。.NET类型系统是建立在值类型和引用类型这两个概念上的。值类型直接存储数据,而引用类型存储对数据(对象)的引用。理解这两种类型的区别及其转换是管理内存和编写高效代码的关键。.NET 允许开发者创建自定义异常类,这些类通常继承自类。 阅读详情

相关推荐

《CLR via C# 第四版》配套示例源码深入分析

NET类型系统允许开发者使用两种类型的对象:引用类型和值类型。引用类型存储在堆上,而值类型存储在栈上或作为结构体的成员存储在堆上。引用类型包括类、接口、委托、数组等;值类型包括基本数据类型、枚举以及结构体。.NET允许开发者创建自己的异常类型,以便更加具体地表示应用程序中可能发生的特定错误。自定义异常通常继承自类或其子类。创建自定义异常时,推荐在构造函数中使用来调用基类的构造函数,以便提供有用的错误信息。

weixin_35752122的博客 1073

NET CLR via C#读书笔记 - 第一章 CLR执行模型

NET CLR via C#读书笔记 - CLR执行模型CLR执行模型1.1 CLR简介1.2 CLR执行模型1.2.1 将源代码编译成托管模块 CLR执行模型 1.1 CLR简介 CLR(Common Language Runtime(公共语言运行时))可以简单理解为是一个支持多种编程语言及多语言互操作,完整的高级虚拟机。   程序在运行的时候有着惊人数量的运行时依赖。每个有用的程序都需要某些运行时函数库,以便其能跟电脑的其它资源(如用户输入设备,磁盘文件,网络通信等)交互,同时程序也需要转换成计算机硬

CreateNewWorld的博客 471

NET CLR via C#高清中文版 (第4版)

针对 CLR和.NET Framework 4.5进行深入、全面的探讨, 并结合实例介绍了如何利用它们进行设计、开发和调 试。全书5部分共29章。第Ⅰ部分介绍CLR基础,第Ⅱ 部分解释如何设计类型,第Ⅲ部分介绍基本类型,第 Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处 理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能应用程序。

NET CLR via C#读书笔记 - 第八章 方法

NET CLR via C#读书笔记 - 第八章 方法1 实例构造器与引用类型(类)2 实例构造器和值类型(结构)3 类型构造器4 操作符重载方法5 转换操作符方法5.1 转换操作符方法描述5.2 转换操作符方法重载6 扩展方法7 分部方法 1 实例构造器与引用类型(类)   ① 构造器是将类型实例初始化为良好状态的特殊方法。   ② 元数据表中名字为.ctor   ③ 创建引用类型时,首先为实例的数据字段分配内存并将分配的内存字节初始化为0,其次初始化附加字段(类型对象指针和同步块索引),最后调用实例构造

CreateNewWorld的博客 329

NET CLR via C#(第4版)中文版(百度网盘链接地址)

NET CLR via C#(第4版)中文版(百度网盘链接地址)

.NET CLR via C#(第4版) 最新完整版 高清文字版

是第4版 正式版 不是prepress版。 本书是全球享有盛誉的技术作家Jeffrey Richter的经典书籍CLR via C#最新版第四版。 本书针对clr、C#5.0和.net framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。 本书深入、全面探讨.NET Framework、CRL和多核编程,广泛讨论FrameworkClassLibrary(FCL)核心类型,对泛型和线程处理等深奥 难懂的开发概念提供权威、实用的指导。

学习 CLR via C#(第4版)(1) - CLR的执行模型【2,3略】

CLR的执行模型 *1.1将源代码编译成托管模块 什么是CLR 公共语言运行时(Common Language Runtime)和Java虚拟机一样也是一个运行时环境它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离 CLR的核心功能 CLR的核心功能包括:内存管理,程序集加载,安全性,异常处理和线程同步。 CLR与使用的编程语言有关吗? 无关。只要编译器是面向CLR的就行。 编译过程 一个程序写完肯定要编译,以前什么C啊什么的都是编译成本机的CPU指令,但是我们的C#不是。

Yr_zwx的博客 1375

NET CLR via C#(中文第4版)-完整版-5

CLR via C# (中文第4版) 完整版-第四卷,共5卷,请在点击上传作者账户资源进行完整下载(csdn最大只能传70MB的文件)

C# 线程——《CLR via C#(第四版)》

线程内核对象(thread kernel object) OS为系统中创建的每个线程都分配并初始化这种数据结构之一。数据结构包含一组对线程进行描述的属性。数据结构还包含所谓的线程上下文(thread context)。上下文是包含CPU寄存器集合的内存块。对于x86,x64和ARM CPU架构,线程上下文分别使用约700,1240和350字节的内存。 线程环境块(thread environme...

莫等闲 4183

CLR via C# 第四版.pdf

一本著名的C#深入学习的书籍,书籍很新,想要深入学习的C#人士,你懂的,第四版,刚出来,国内没得卖

SOC Boot学习(二)——JTAG Debug介绍

JTAG(Joint Test Action Group ,联合测试行动小组 ) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。JTAG 技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路 TAP ( Test Access Port ,测试访问口),通过专用的 JTAG 测试工具对内部节点进行测试。如今大多数比较复杂的器件都支持 JTAG 协议,如 ARM 、 DSP 、 FPGA 器件等。

yttt的博客 1605

.NET:CLR via C# Thread Basics

A thread is a Windows concept whose job is to virtualize the CPU. Thread Overhead Thread kernel object The operating system allocates and initializes one of these data structures for each thread c...

weixin_34194317的博客 156

构建自己的哨兵数据集(以sentinel-1为例,使用SNAP软件)

通过欧洲航天官网获取哨兵数据的产品,通过SNAP软件进一步得到SAR图像(以导出图片为例)

xiaoxTai的博客 6182

《CLR via C#》CLR基础

CLR是公共语言运行库(Common Language Runtime),又叫公共语言运行时。CLR和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境,可由面向CLR的所有语言使用。它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。 .NET框架是一种以CLR为基础、支持多种语言(C#、F#、VB.NET、C++、Python等)的开发的软件...

陈云佳的专栏 3758

单片机多级菜单的简单实现

单片机多级菜单的简单实现 多级菜单的思路 最近想把stm32上的oled显示屏做的好看一些,于是动手写了写一个多级菜单,思路很简单,每个页面用单独的函数封装好,每个功能也是用单独的函数进行封装,用了3个按键,两个切换键,一个确定键。 首先来看看用啥判断页面的(这偷个懒,希望没人打我) //页面标志位 uint8_t s1 = 0; //主页面功能号 uint8_t s2 = 0; //主次页面判断标志位 uint16_t s3 = 1; //次页面功能号 主页面的显示函数,这是个很枯燥的一

qq_43940175的博客 7605

FreeRTOS笔记(十五)FreeRTOS总结

文章目录01 - 裸机和FreeRTOS区别1.1 - 裸机1.2 - FreeRTOS1.3 - 区别02 - 对FreeRTOS的感受03 - 推荐 上一文链接:FreeRTOS笔记(十四)[简] 软件定时器、事件组、任务通知 01 - 裸机和FreeRTOS区别   学完FreeRTOS,应该要自己总结一下FreeRTOS和裸机的区别,宏观上说,FreeRTOS是一个运行在裸机上的微内核,...

单眼皮根号三的博客 4113

CLR基础之一---认识CLR [《CLR via C#》读书笔记]

《CLR via C#》读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称。这是通用语言架构(简称CLI)的微软实现版本,它定义了一个代码运行的环境。CLR运行一种称为“通用中间语言”的字节码,这个是微软的通用中间语言实现版本。 CLR运行在微软的视窗操作系统上...

weixin_30872499的博客 2241

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 403

【亲测免费】 深入探索.NET CLR:《CLR via C》第4版资源推荐

深入探索.NET CLR:《CLR via C#》第4版资源推荐 【下载地址】CLRviaC第4版中英文版资源下载 - **书名**: CLR via C# 第4版- **语言**: 中文版 & 英文版- **格式**: PDF- **特点**: 高清无水印 ...

gitblog_09724的博客 786

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1815

CLR via C# 第一章—第十三章

方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。每个可选形参都有一个默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。

2301_79124729的博客 1198

手把手教你学SOC芯片架构--NoC(片上网络,Network on Chip)全方位解析

​、​。

MHD0815的博客 863

《CLR via C#》读书笔记(8)-- 泛型(下)

1. 类型对象 首先看如下代码: class Program { static void Main(string[] args) { List<object> objs = new List<string>(); Console.ReadKey(); ...

Sinolife0605的博客 180

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《CLR Via C#》第一章

大致介绍了CLR执行应用程序的流程,编译代码流程,介绍了IL、元数据和程序集的关系。

weixin_51374560的博客 964

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《CLR via C#》是Jeffrey Richter撰写的一本经典书籍,深入讲解了.NET Framework的核心——公共语言运行时及其在C#编程中的应用

本书内容涵盖了CLR的基础知识、类型系统、内存管理、线程、异步编程、反射、动态编程等主题,适合中高级开发者阅读。如果需要特定章节的更详细内容,可以进一步要求。内容介绍: 介绍CLR的基本概念,包括托管代码、IL(中间语言)、JIT编译、元数据、程序集和应用程序域(AppDomain)。如果需要某章节的具体代码示例、更详细的案例分析,或针对某一主题的深入讲解(如反射、异步编程),请告诉我,我可以进一步扩展!内容介绍: 讲解.NET类型系统的核心,包括值类型、引用类型、装箱/拆箱、类型转换和类型的安全性。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 627

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: NET CLR via C#读书笔记 - 第十一章 事件
下一篇: NET CLR via C#读书笔记 - 第十三章 接口
藏海花鸣
博客等级 码龄8年 40粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值