NET CLR via C#读书笔记 - 第六章 类型和成员基础

IL中call与callvirt的区别及其对Equal操作的影响 《CLR via C#》中是这样描述它们的:编译器在生成方法时会在方法定义表中写入该方法的记录项,每个记录项中有一组标志指令方法是静态方法、实例方法还是虚方法,如下图:生成IL代码时,编译器会根据这些标志,判断应如何生成IL代码(是使用call还是callvirt)。call (静态/前期绑定)该IL指令可调用静态方法、实例方法和虚方法。用call指令调用静态方法,必须指定方法的定义类型。用cal... 阅读详情

1 类型成员

1.1 类型成员一览

成员说明
常量描述数据值恒定不变的符号。
与类型关联,不与类型实例关联。
字段描述只读或者可读写的数据值。
字段可以是静态的(与类型关联),也可以是非静态的(与类型实例关联)。
实例构造器将新对象的实例字段初始化的特殊方法。
类型构造器将新对象的静态字段初始化的特殊方法。
方法是用于查询或更改对象/类型状态的函数。
方法可以是静态的(与类型关联),也可以是非静态的(与类型实例关联)。
操作符重载是一种特殊方法,定义了当操作符作用于对象时,对象应该如何进行操作。
转换操作符是一种特殊方法,是定义如何显示或者隐式的将对象从一种类型转化为另一种类型的方法。
属性设置和查询对象或者类型的逻辑状态,访问时保证状态不被破坏。
属性可以是静态的(与类型关联),也可以是非静态的(与类型实例关联)。
属性可以无参数,也可以有参数。
事件静态事件允许类型向一个或多个静态/实例方法发送通知,非静态(实例)事件允许对象实例向一个或多个静态/实例方法发送通知。
事件包含两个方法:允许类型或者实例方法登记事件和注销对某一事件的关注。
类型类型内部可以嵌套定义其它类型。

演示代码如下:

using System;
public sealed class Demo{
	private class SubDemo{}  //嵌套类型
	
	private const int c_SomeConstant = 0; //常亮
	private readonly string m_SomeString = ""; //只读字段
	private static int s_SomeStatic = 1; //静态可读可写字段
	private int s_SomeUnStatic = 2;      //可读可写字段
	
	static Demo(){}  		//类型构造器
	public Demo(){}			//实例构造器
	public Demo(int i){}	//带参数的实例构造器

	private void Func_UnStatic_1(){}		//实例方法
	public static void Func_Static_1(){}	//静态方法

	//实例属性
	public int Some_attr_1{
		get{return 0;}
		set{}
	}
	
	//实例有参属性(索引器)
	public int this[string s]{
		get{return 0;}
		set{}
	}
	
	//实例事件
	public event EventHandler SomeEvent;
}

2 类型的可见性

public : 全局可见,不仅仅对定义类型所处的程序集可见,在其它程序集中也可见。
internal: 对定义类型所处的程序集可见,在其它程序集中不可见。

3 类型成员的可访问性

CLR术语C#术语说明
Privateprivate成员只能由定义类型或者任何嵌套类型访问。
Familyprotected成员只能由定义类型,任何嵌套类型和任意程序集中的派生类型访问。
Family and Assembly不支持成员只能由定义类型,任何嵌套类型和同一程序集中的派生类型访问。
Assemblyinternal成员只能由定义程序集中的类型访问。
Family or Assemblyinternal成员可由任意嵌套类型,任何派生类型以及定义程序集中的任何类型访问。
Publicpublic成员任何类型访问。

4 类型的分类

4.1 静态类

  静态类不可实例化,使用static关键字进行定义,静态类的作用就是组合一组相关的操作,static只能作用于类(class),不能作用于结构(struct)。
  静态类有以下限制:

静态类限制
静态类必须从System.Object派生,从其它类派生没有任何意义,因为静态类不能实例化,而继承只适用于对象。
静态类不能实现任何接口,只有类的实例才可以调用类的接口方法,而静态类无法实例化。
静态类只能定义静态成员(字段,方法,属性,事件),定义实例字段都会编译报错。
静态类不能作为字段,方法参数和局部变量使用。检测到以上用法,在编译时,编译器会编译报错。

4.2 分部类,结构和接口

  类,结构和接口的源代码定义可能在某些情况下需要分散到多个源代码文件中,因此出现了分部类,结构和接口,使用partial定义分部类,结构和接口。
  分部类,结构和接口应用于如下情况:
  1、源代码控制:便于团队合作
  2、将类/接口/结构分解为不同的逻辑单元:便于代码阅读和功能删减和添加
  3、代码拆分:便于分离类型中稳定和不稳定的部分

5 组件,多态和版本控制

5.1 C#关键字对其组件版本控制的影响

C#关键字作用于类型作用于方法/属性/事件作用于常量/字段
abstract表示不能构造该类型实例。表示为了构造派生类型的实例,派生类型必须重写和实现该成员。不允许
virtual不允许表示可由派生类型重写。不允许
override不允许表示派生类型正在重写基类型成员。不允许
sealed该类型不能用作基类。表示成员不能被派生类重写,只能将该关键字用于重写虚方法的方法。不允许
new表示该类型与基类中相似成员无任何关系表示该方法/属性/事件与基类中相似成员无任何关系表示该常量/字段与基类中相似成员无任何关系

5.2 CLR调用虚方法简述

5.2.1 call和callvirt

  C#中提供了call和callvirt两种调用指令的方式,其中call可以执行静态,实例和虚方法,callvirt只能执行实例和虚方法,不能调用静态方法。
  call在执行指令时,假定变量类型不为null,call通常以非虚方式调用虚方法。
  callvirt在执行指令时,如果callvirt调用的是虚方法,CLR会检查调用者的实际类型,以多态方式调用虚方法,这种方式必须保证变量不为null,所以CLR会检查变量类型是否为null,为null则抛出异常NullReferenceException,不为null才会正确调用。

  以上内容为对《NET CLR via C#(第四版)》第六章内容的阅读笔记,只记录其中核心部分内容,书中还仔细描述了如何合理使用类型的可见性和可访问性,对类型进行版本控制的虚函数的处理等话题,如需要详细阅读请自行查阅本书第六章内容。

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

相关推荐

《CLR via C#》学习笔记【1】

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

在云端 4225

《CLR Via C# 第3版》笔记之(六) - IL中的call和callvirt

C#中调用一个函数时生成的IL代码有两种形式,分别为call 和 callvirt。 主要内容 call和callvirt的区别 call和callvirt的例子 1. call和callvirt的区别 call的callvirt的区别主要有两点: 1)call可以调用静态方法,实例方法和虚方法      callvirt只能调用实例方法和虚方法,不能调用静态方法 2)...

weixin_34362790的博客 287

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

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

weixin_35257663的博客 924

CIL之——call和callvirt的区别

CIL代码中调用方法的常用方法有call和callvirt两种,那它们到底有什么区别呢?下面让我们通过例子来看一看吧!

xiaouncle的博客 3057

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

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

weixin_35752122的博客 1073

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

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

weixin_35433448的博客 1328

c# IL 入门

看下面这个例子: using System; using System.Collections.Generic;   namespace ConsoleApplication3 {     class Program     {         delegate void Printer();         //代理相当于一个类型         static void Pr...

icebergliu1234的博客 1万+

CLR via C#(第3版)中英文双语带书签及源码完整版

CLR(Common Language Runtime)是.NET程序的执行引擎,负责管理代码的加载、编译、执行与资源回收。其核心组件包括JIT编译器、垃圾回收器(GC)、类型系统、异常处理机制和安全引擎,共同构成托管执行环境。// 示例:一个简单的托管程序入口");该代码在运行时由CLR完成程序集加载 → JIT编译 → 托管执行 → 内存自动管理的全生命周期控制,体现其对开发者透明但底层高度可控的特性。场景推荐做法频繁创建大数组改用复用缓冲区。

weixin_33608403的博客 914

CLR via C#第六章:CLR调用虚方法、属性和事件

任何方法包括一个名称、一个签名和一个返回值。 理论上即使方法名和签名相同,只要返回值不一样。这也算是两个不同的方法。但是,实际上,只有IL汇编语言利用了这个特点。(同名方法,必须要求参数不一致,如果只是返回值不一样是不会通过编译的) 编译器在编译代码时,会在生成的程序集的方法表中记录方法是实例方法、静态方法还是虚方法的。对于不同的方法,CLR会调用不同的IL指令来执行方法的。        ...

maoxiaohai123的博客 509

告别环境报错:Qt Creator里配置Android SDK/NDK/JDK路径的完整避坑指南

本文详细解析了在Qt Creator中配置Android SDK/NDK/JDK路径的完整避坑指南,深入探讨了路径检测的内部机制、构建套件配置的隐藏逻辑以及项目级与全局配置的优先级。通过实际案例和高级排查技巧,帮助开发者解决常见的环境报错问题,提升Qt安卓开发效率。

weixin_42548829的博客 238

中兴FTTR光猫变简易OLT:低成本搭建全光监控与局域网实战指南

本文详细介绍了如何将中兴FTTR光猫改造为简易OLT设备,实现低成本全光监控与局域网扩展。通过LOID认证、桥接模式设置及终端数破解,用户可利用二手设备搭建高性能光纤网络,适用于远程监控和长距离组网场景,显著降低部署成本。

chair的专栏 2023

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

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

weixin_30872499的博客 2241

自动驾驶轨迹规划算法——Apollo Lattice Planner

Apollo Lattice Planner是百度Apollo自动驾驶系统中的一种基于采样的实时轨迹规划算法。其核心思想是在离散化的状态空间中,对终端状态进行采样,并通过多项式曲线连接当前状态与候选终端状态,形成候选轨迹集,最后基于代价函数选择最优轨迹。该算法将车辆可达状态按纵向距离、横向偏移和速度等维度规则离散化,形成"格点"状态空间。 Lattice Planner通过三个主要步骤实现轨迹规划:1)终端状态采样,在规划时域内枚举多种驾驶意图;2)轨迹生成,使用五次多项式连接起点与各终

swaggytiger的博客 1623

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

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

2301_79124729的博客 1198

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7794

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1416

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

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

gitblog_09724的博客 786

【WRF教程第3.5期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例

WW、forever的博客 1422

《CLR via C#》读书笔记---06 类型和成员基础

CLR via C#

Eden's space 867

在Simulink中进行基于强化学习控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于强化学习控制策略的三相逆变器仿真的完整流程。主要内容包括:1)准备工作,确保MATLAB/Simulink及相关工具箱安装;2)构建三相逆变器基础模型,包含电源、全桥电路、LC滤波器和负载;3)重点阐述强化学习控制器设计,涉及状态空间、动作空间定义,奖励函数设计和算法选择;4)实现控制逻辑,包括环境创建、代理配置和训练过程;5)仿真设置与结果分析。文章强调了模型调试优化的重要性,并建议结合文献研究提升控制效果。该方案为开发自适应电力电子控制系统提供了实用指南。

amy_mhd的博客 269

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 145

《CLR via C#》第六章 读书笔记

第六章 类型和成员基础 第一节 类型的各种成员 1、类型中可定义0个或多个以下种类的成员:常量、字段、实例构造器、类型构造器、方法、操作符重载、转换操作符、属性、事件、类型。 2、无论什么编程语言,编译器都必须能处理源代码,为上述每种成员生成元数据和IL代码。所有编程语言生成的元数据格式完全一致。这正是CLR成为“公共语言运行时”的原因。元数据是所有语言都生成和使用的公共信息。(疑问:面向...

qq_41543031的博客 241

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

读 CLR-via-C# 总结之六 类型和成员基础

类型和成员基础 6.1类型的各种成员 常量:就是指出数据恒定不变的一个符号。通常与类型想关联,而不是对象。所以从逻辑上讲,常量始终是静态成员。字段:表示一个只读或者可读/可写的数据值。可以是静态的,也可以是实例,被认为是对象状态的一部分。本书建议将字段声明为私有字段,防止类型或者对象的状态被类型外部的代码破坏。实例构造器:是将新对象的实例字段初始化为良好初状态的一个特殊方法。类型构造器:是将类...

chaohongliang的博客 202

蓝牙模块HM-10手册

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《CLR Via C#》第一章

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

weixin_51374560的博客 964

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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#读书笔记 - 第五章 基元,引用和值类型
下一篇: NET CLR via C#读书笔记 - 第七章 常量和字段
藏海花鸣
博客等级 码龄8年 40粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值