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

【C++】POCO学习总结(六):线程、线程池、同步

Poco::RunnableAdapter继承自Poco::Runnable,在Poco::RunnableAdapter构造函数中指定了类和方法;Poco::ThreadLocal是线程局部变量,也叫线程局部存储,意思是模版ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。

郭老二 5098

Python实战:高效稳定采集微信视频号评论的API爬虫方案

网络爬虫是数据采集领域的核心技术,其原理是通过程序模拟浏览器行为,向目标服务器发送HTTP请求并解析响应数据,从而自动化获取网页或接口中的信息。这项技术的核心价值在于能够高效、批量化地收集公开数据,为市场分析、舆情监控和竞品研究提供数据基础。在社交媒体分析、电商价格监控等应用场景中,爬虫技术尤为重要。针对微信视频号这类动态加载的复杂应用,传统的GUI自动化工具(如影刀RPA)常面临性能瓶颈和风控挑战。本文聚焦于通过Python实现**无感采集**,直接与后端**API接口**交互,构建稳定高效的评论数据采集

weixin_30899023的博客 328

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

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

weixin_30872499的博客 2241

DGX Spark上PyTorch GPU环境配置实战:CUDA 13.0与ARM架构全流程

在深度学习中,CUDA作为GPU加速计算的底层基础,其版本与深度学习框架(如PyTorch)的匹配直接影响模型训练的效率与稳定性。GPU环境配置不仅涉及驱动、CUDA工具链与框架运行时的协同,还依赖于硬件架构与预构建包的兼容性。在AI开发机Ubuntu系统上,正确对齐CUDA版本、计算能力架构及安装源,是避免环境故障、发挥硬件算力的关键。无论是面向个人AI超算还是通用GPU服务器,掌握版本对齐、路径隔离与验证方法,都能大幅提升开发效率。本文以DGX Spark为例,详解从环境摸底到PyTorch GPU版本

weixin_29483277的博客 216

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

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

2301_79124729的博客 1198

新卡尝鲜记:RTX 5070Ti适配PyTorch生态的实战避坑指南

本文分享了RTX 5070Ti适配PyTorch生态的实战经验。针对CUDA 12.8兼容性问题,详细介绍了安装PyTorch Nightly版本、手动编译xformers库以及寻找PyTorch3D第三方预编译包的完整流程与解决方案,帮助用户快速搭建可用的深度学习开发环境。

weixin_29094775的博客 287

【CAN总线测试】——通讯相关诊断测试

本章主要介绍通讯相关诊断测试用例设计

LOVE135149的博客 1813

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

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

gitblog_09724的博客 786

PCL:SAC-IA+ICP配准

【代码】SAC-IA+ICP配准。

m0_71596228的博客 1017

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

CLR via C#

Eden's space 867

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

qq_41543031的博客 241

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

chaohongliang的博客 202

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《CLR Via C#》第一章

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

weixin_51374560的博客 964

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、付费专栏及课程。

余额充值