NET CLR via C#读书笔记 - 第五章 基元,引用和值类型

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

1 基元类型

1.1 概念

基元类型可以简单理解为编译器本身支持的数据类型
例如:System.Int32  a  =  new System.Int32();  //值默认初始化为0
由于编译器内部对此做了处理,我们可以简单的将语句修改为:
int a = 0; 
编译器会将int在编译时映射为FCL中System.Int32类型

1.2 C#基元数据类型

C#基元类型FCL类型是否符合CLS说明
sbyteSystem.SBytefalse有符号8位值
byteSystem.Bytetrue无符号8位值
shortSystem.Int16true有符号16位值
ushortSystem.UInt16false无符号16位值
intSystem.Int32true有符号32位值
uintSystem.UInt32false无符号32位值
longSystem.Int64true有符号64位值
ulongSystem.UInt64false无符号64位值
charSystem.Chartrue16位Unicode字符
floatSystem.SingletrueIEEE 32位浮点值
doubleSystem.DoubletrueIEEE 64位浮点值
boolSystem.Booleantruefalse/true值
decimalSystem.Decimaltrue128位高精度浮点值,其中1位是符号位,96位是值本身(N),8位为比例因子(k),实际值为 ± N * (10 ^ k)
stringSystem.Stringtrue字符串(字符数组)
objectSystem.Objecttrue所有类型的基类型
dynamicSystem.Objecttrue对于CLR,dynamic与object完全一致,只是C#编译器在处理时会让dynamic定义的类型参与动态调度

1.3 基元类型的相关知识点

1.3.1 C#中允许基元类型执行安全的隐式转换

  安全转换指的是转换完成后不丢失精度和数量级。
  例如System,Int32向System.Int64进行转换,不需要显示转换,但是System.Int64向System,Int32则需要显示转换。
  补充知识点:不同的编译器对于同一源代码的转换会产生不同的结果,例如将 6.8f 转换为 System.Int32 类型时,有些编译器是向上取整,有些编译器是向下取整,C#编译器永远是执行向下取整,也就是对6.8f进行截断处理,只保留6这个整数部分。

1.3.2 checked和unchecked

  C#中基元类型的计算很多时候都会出现溢出情况,C#中支持使用checked和unchecked自定义是否检查溢出情况,C#编译器一般是默认检查溢出的,书写方式如下:

Byte b = 100;
b = checked((Byte)(b + 200)); //会抛出overflowException异常

也可以对某一代码块进行溢出检查:

checked{
	Byte b = 100;
	b = (Byte)(b + 200); 
}

特例说明:对基元类型System.Decimal使用checked和unchecked操作符是无效的,因为CLR本身不知道如何去处理System.Decimal值得IL指令,需要借助System.Decimal类型定义的Add等操作函数以及重载的+,-,*,/来进行实际的运算,所以System.Decimal类型运算相比于其它基元类型要慢,而且出现溢出时一定会抛出overflowException异常。

2 引用类型和值类型

2.1 引用类型和值类型定义

所有值类型都从System.ValueType派生,使用struct关键字定义。
所有引用类型都使用class关键字定义。

2.2 引用类型和值类型相关知识点

1、引用类型是从托管堆分配内存,值类型是在线程栈上分配空间。
  事实上引用类型使用过程中会执行以下四个步骤:
  ① 从托管堆分配内存
  ② 对象分配时都需要额外分配成员,且分配的额外成员必须初始化
  ③ 对象的其它字节也必须初始化为0
  ④ 从托管堆分配内存时,可能会强制执行一次垃圾回收机制
  值类型不受以上四个部分的困扰,值类型在线程栈上分配空间,且实例的字段也是直接存储,不需要分配额外的成员进行控制。值类型的存在减轻了托管堆的压力,而且显著减少垃圾回收次数,从而有效的提高程序的执行效率。

2、所有值类型都是隐式密封,避免作为其它类型(引用类型和值类型)的基类型。

3、值类型的装箱和拆箱机制
  装箱:将值类型的实例转化为引用类型。
  过程如下:
  ① 根据值类型的大小以及需要分配的额外成员(类型对象指针和同步块索引)在托管堆上分配内存。
  ② 将值类型的字段复制到第一步中分配的对内存中。
  ③ 返回对象地址(也就是分配堆的内存的地址)。

  拆箱:将已装箱的值类型对象转化为未装箱的值类型。
  过程如下:
  ① 获取已装箱的值类型对象各个字段的地址。
  ② 将各个字段包含的值复制到基于栈的值类型实例中。

结合上述说明,值类型装箱的代价要比拆箱的代价大,但两者都会对程序运行速度和内存资源造成影响,必要时要检查书写的代码是否存在频繁的装拆箱,并着手进行优化。

  以上内容为对《NET CLR via C#(第四版)》第五章内容的阅读笔记,只记录其中核心部分内容,书中还仔细描述了使用接口更改已装箱值,对象的同一性和一致性,对象哈希码以及dynamic等话题,如需要详细阅读请自行查阅本书第五章内容。

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

相关推荐

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

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

weixin_35752122的博客 1073

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

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

2301_79124729的博客 1198

《CLR via C# 最完整中文版》电子书下载种子

本文还有配套的精品资源,点击获取 简介:《CLR via C#》是Jeffrey Richter撰写的深入介绍.NET CLR内部机制的经典书籍。中文版为中文读者提供了学习.NET开发核心技术的良机。书中详细讲解了.NET类型系统、内存管理、JIT编译、异常处理、多线程编程、反射、元数据、安全模型等关键知识点,并结合案例理论与实践,帮助开发者编写出更高效、可靠的.NET程序...

weixin_35433448的博客 1328

【C#】详解值类型和引用类型区别

值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。 引用类型(reference type):string 和 class统称为引用类型。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 5831

CLR via C#: 4th Edition with Full Table of Contents

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

weixin_35257663的博客 924

工业自动化实战:用LabVIEW的DSC模块实现MODBUS-TCP设备控制

本文详细介绍了如何利用LabVIEW的DSC模块实现工业自动化中的MODBUS-TCP设备控制。通过环境准备、核心功能解析、状态机实现及典型工业场景实战,帮助工程师快速掌握稳定可靠的通讯技术,提升工业自动化系统的运行效率。

salt9的博客 1057

学习CLR via C#(第4版)(三)- 基元类型、引用类型和值类型

基元类型、引用类型和值类型 5.1编程语言的基元类型 FCL(Framework Class Library) Framework 类库,FCL是 .net Framework 包含的一组DLL程序集的统称,FCL包含了提供了很多功能,它是生成.NET Framework 应用程序、组件和控件的基础。FCL由命名空间组成。每个命名空间都包含可在程序中应用的类、结构、委托和接口等。常见的命名空间有System、System.Windows等。 什么是基元类型 编译器直接支持的数据类型称为基元类型(primit

Yr_zwx的博客 559

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1652

C#编程语言及.NET 平台快速入门指南

线程分为前台线程和后台线程,后台线程不妨碍程序的终⽌。线程具有优先级,优先级⾼的线程会得到更多的CPU时 间。多线程可以提⾼对CPU时间的利⽤率,但会占⽤更多的内存等资源。

2401_86940371的博客 4979

NXP应用随记(八):S32K3XX的HSE学习记录(HSE\MU\UTEST\IVT\A,B SWAP)

HSE,即硬件安全引擎(Hardware Security Engine),是NXP S32K312微控制器(MCU)中的一个功能,它提供了一系列的安全特性,包括加密、安全启动和密钥存储等。这些功能旨在增强汽车电子系统的信息安全,符合ISO26262标准,达到ASIL D安全等级。具体来说,S32K312的HSE支持AES-128/192/256加密、RSA、ECC等加密算法,以及侧通道保护,确保了数据传输和存储的安全性。

梦想技术家 9740

保姆级教程:用MS建完分子模型,如何一键转成LAMMPS能用的data文件?

本文详细介绍了如何将Materials Studio(MS)构建的分子模型转换为LAMMPS可用的data文件的全流程。重点讲解了力场选择、环境配置、转换命令参数解析及常见问题排查,帮助初学者快速掌握MS与LAMMPS之间的数据转换技巧,特别适合计算材料学领域的研究人员。

weixin_42665255的博客 470

CLR via C#(02)-基元类型、引用类型、值类型

一、 基元类型 编译器能够直接支持的数据类型叫做基元类型。例如int, string等。基元类型和.NET框架类库FCL存在着直接的映射关系。 string和String? 面试的时候曾经被问到过这个问题,C#中的基元类型string实际上对应了System.String(FCL)类型,所以两者使用的时候没有什么不同。 类型转换 编译器能够在基元类型之间进行显式或隐式转换。如果...

abk46653的博客 142

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7810

C#详解值类型和引用类型区别

首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。 值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。         引用类型

10万+

【OD统一考试(B卷)】比赛的冠亚季军,Python 解答

比赛的规则是 0 号和 1 号比赛,2 号和 3 号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮,实力值大的获胜,实力值相等的情况,id 小的情况下获胜,轮空的直接进入下一轮。第一轮比赛,id 为 0 实力值为 2 的运动员和 id 为 1 实力值为 3 的运动员比赛, 1 号胜出进入下一轮争夺冠亚军,id 为 2 的运动员和 id 为 3 的运动员比赛,3 号胜出进入下一轮争夺冠亚军;2 号与 0 号,比赛进行季军的争夺,2 号实力值为 4,0 号实力值 2,故 2 号胜出,得季军。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

WblockCloneObjects克隆一个图纸内的实体包括块参照,同名块参照的处理

public static void HeBingTu2(double lieJu, List<string> filePaths) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (DocumentLock docLock = doc.Lock...

1108

基元类型、引用类型、值类型、装箱和拆箱

1.基元类型 有些数据类型我们平常写代码经常会用到,例如:int,string等,例如下面我们定义一个整数: int a =0; 我们也可以用下面的写法定义: System.Int32 a = new System.Int32(); 以上两种写法的结果都是一样的,为什么会这样呢?,大家肯定知道是编译器做的优化;本人比较喜欢第一种写法,因为这种语法不仅增...

afz40835的博客 287

【AI智能体】Coze 数据库从使用到实战操作详解

Coze 数据库使用到实战详解

congge 5911

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

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

weixin_30872499的博客 2241

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

gitblog_09724的博客 786

pscad IEEE标准系统搭建说明

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

NET CLR via C#读书笔记 - 第七章 常量和字段

NET CLR via C#读书笔记 - 第七章 常量和字段1 常量1.1 常量定义1.2 常量的特点和限制2 字段2.1 字段定义2.2 字段修饰符 1 常量 1.1 常量定义   常量是从值不变化的符号,定义常量符号时,值必须在编译阶段就确认,编译后常量将保存在程序集的元数据中。 1.2 常量的特点和限制   ① 只能定义编译器支持的基元类型的常量,定义非基元类型的常量,必须要将值设置为null(意义不大)。   ② 常量值永不改变,通常被视为类型的一部分(被视为静态成员,而不是实例成员)。   ③ 定

CreateNewWorld的博客 219

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CLR via C# 值类型的装箱和拆箱

值类型比引用类型“轻”,原因是它们不作为对象在托管堆中分配,不被垃圾回收,也不通过指针进行引用。 但很多时候都需要获取对值类型实例的引用。 创建ArrayList来容纳一组Point结构。 Add方法原型如下: Add获取的是一个Object参数。也就是说,Add获取对托管堆上的一个对象的引用(或指针)来作为参数。 但是代码传递的是Point,值类型。为了使代码正确工作,Poin...

songhuanfei2017的博客 226

CLR via C#读书日记一' 引用类型和值类型'

  CLR支持两种类型:引用类型和值类型。   引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址。   使用引用类型必须注意到一些问题:   1)内存必须从托管堆上分配。   2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化。   3)对象中的其他字节(...

dingsiquan6406的博客 124

《CLR Via C#》第一章

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

weixin_51374560的博客 964

NET CLR via C#读书笔记 - 第九章 参数

NET CLR via C#读书笔记 - 第九章 参数1 可选参数和命名参数1.1 代码示例1.2 可选参数以及命名参数的规则和原则2 以引用方式传参3 可变数量的参数 1 可选参数和命名参数 1.1 代码示例   可选参数就是函数包含默认值得形参,命名参数是指调用方法的时候通过指定参数名称来传递实参,代码示例如下: public sealed class Demo{ //定义含有默认参数值的函数 其中x,s就是可选参数 public void dpFunc(int x = 0,string s = "

CreateNewWorld的博客 264

[C#]CLR via C#研习系列:动态基元类型和动态的C#

今天读到了《CLR via C#》中动态基元类型的章节,恰好刚刚在候选区看到了一篇《为什么可以说Java语言是准动态语言?》的文章,其文中说Java依赖反射可以称为‘准动态语言’,而C#是静态语言。 我先不说结论,先来看一下什么是动态语言。 引用互动百科的词条: 动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众...

badao19931216的博客 219
上一篇: NET CLR via C#读书笔记 - 第一章 CLR执行模型
下一篇: NET CLR via C#读书笔记 - 第六章 类型和成员基础
藏海花鸣
博客等级 码龄8年 40粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值