一文教会你C#堆栈分配

文章目录


前言

  • 阅读文本需要耐心

提示:请在阅读中保持耐心。

本文将解释类型、对象、线程栈和托管堆在运行时的相互关系。此外,还将解释调用静态方法、实例方法和虚方法的区别。首先从一些计算机基础知识开始。

下面展示一些 内联代码片

Void M1(){
 string name = "Joe"; 
 M2(name);
 ·······
 return
}

在这里插入图片描述
在这里插入图片描述

围绕CLR,调整一下。假设有以下两个类定义:

Internal class Employee{
	Public Int32 GetYearsEmployed() {……}
	Public virtual String GetProggressReport() {……}
	Public static Employee Lookup(string name) {……}
}

Internal sealed class Manager : Employee
{
Public override string GetProgressReport() {……}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此,我们已经讨论了源代码、IL和JIT编译的代码之间的关系,还讨论了线程栈、实参、局部变量以及这些实参和变量如何引用托管堆上的对象。还知道对象含有一个指针指向对象的类型对象(类型对象中包含静态字段和方法论)。还讨论了JIT编译器如何决定静态方法、非虚实例方法以及虚实例方法的调用方式。理解这一切之后,可以深刻认识CLR是如何工作的。以后在建构、设计和实现类型、组件以及应用程序时,这些知识会带来很大帮助。

接下来是深入讨论CLR内部发生的事情

Employee和Manager类型对象都包含“类型对象指针”成员。这是由于类型对象本质上也是对象。CLR创建类型对象时,必须初始化这些成员。初始化成什么呢?

CLR开始在一个进程中运行时,会立即为MSCorLib.dl中定义的System.Type类型创建一个特殊的类型对象。Employee和Manager类型对象都是该类型的“实例”。因此,它们的类型对象指针会初始化成对System.Type类型对象的引用。

当然,System.Type 类型对象本身也是对象,内部也有“类型对象指针”成员。这个指针指向它本身,因为System.Type类型对象本身是一个类型对象的“实例”。现在我们总算理解了CLR的整个类型系统极其工作方式

顺便说一句,System.Object的GetType方法返回储存在指定对象的“类型对象指针”成员中的地址。也就是说,GetType方法返回指向对象的类型对象的指针。这样就可判断系统中任何对象(包括类型对象本身)的真实类型。

在这里插入图片描述


最后

文章来源于NET CLR via 第四版
好像图片有点糊,有需要的朋友可以联系我获取文字版。

Thank you for your read!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值