people p=new people()
以上面例子为例当我们用new操作符实例化一个类时,它是这样做的:
1.计算该类型及其所有基类的实例字段所需要的字节数,及该对象的额外对象(类型对象指针,同步索引块)的字节数。
2.根据该对象的大小在托管堆上分配同等大小的空间。
3.初始化对象的类型对象指针和同步索引块。
4.调用该类型的实例构造函数,在此实例构造函数中会调用该类的所有基类的实例构造函数,之后在此实例构造函数中将会初始化这个类型定义的实例字段。
5.返回指向新建对象的一个引用(或指针),这里这个引用会保存在变量p中,p是people类型。
下面来解释类型,对象,线程栈,托管堆在运行时的联系及调用静态方法,实例方法,虚方法的区别。
我们先来定义俩类如下:
public class Person
{
public int Getyear() { return 1; }
public virtual string Getname() { return "michael"; }
public static Person Getperson(int i)
{
if (i = 1)
{
return new Person();
}
else
{
return new Man();
}
}
}
public class Man:Person
{
public void Eat() { }
public override string Getname(){ return "Jackson"; }
}
然后我们在aspx中有一个方法如下:
public void M(int i)
{
Person p;
int year;
p = new Man();
p = Person.Getperson(i);
Label1.Text = p.Getname();
Label2.Text = p.Getyear().ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
int i = int.Parse(TextBox1.Text);
M(i); ****
}
当****处执行M方法的时候,进程已启动,CLR已加载到其中,托管堆已初始化,也已经创建了一个线程(已经分配了1M空间的栈),这时线程已经执行了一些代码,现在马上要调用M方法,那么此时的图如下:
如果是第一次执行该方法,JIT编译器需要将M的IL代码编译成本地CPU代码。此时CLR会注意到M内的所有类型int,Person,Man。然后加载与这些类型相应的程序集,再根据程序集中的元数据提取与这些类型相关的信息,然后根据这些信息在托管堆上创建相应的类型对象(就是我们平常理解的类),由于int等类型的类型对象一般早就建立了,所以这里就不再画了,这时图如下:
可以看出不光是类的静态字段是所有对象共有的,类的方法其实也是所有对象共有的。当我们写这样一句代码时:new Man().Getyear() CLR会在Man类型对象中找Getyear()方法,找不到回到其基类中找。new Man().Getyear() 就相当于 Man m=new Man(); m.Getyear() 与 Person m=new Man(); m.Getyear()不同。
当所有类型对象都建立完毕且M方法被JIT编译完后,就开始执行M方法了。首先,M方法的"序幕"代码会为M方法中的所有局部变量在线程栈上分配内存。此时图如下:
执行到p = new Man();时将构造一个Man对象(关于new操作上面已经讲述了),不过要注意对象里的实例字段不光是它自身定义的实例字段还包括其所有基类的实例字段,也就是说实例字段不是所有对象共有的,此时图如下:
可以看出Man对象也指向与其类型对应的Man类型对象,尽管对象的引用p是Person类型,此时p只能使用person类型中定义的实例字段及实例方法。 所以调用实例方法看变量引用的类型Person p,其只能使用person类型中的实例方法。
执行到p = Person.Getperson(i);时,调用静态方法没什么好说的,直接使用适应相应的类型调用,会找到相应的类型对象里的静态方法。这里我们假设其仍然返回的是Man对象,此时图如下:
这时变量引用p指向了一个新的Man对象,所以之前的那个Man对象很快就会被GC处理掉。
执行到Label1.Text = p.Getname();这句时,调用的是一个虚实例方法,掉用虚实例方法时要看p是一个什么对象,这里是一个Man对象,所以会调用Man类型对象的Getname()而不是Person类型对象的Getname()。
最后,我们看到那些类型对象也有类型对象指针,所以其实类型对象本身也是对象,它们的类型对象指针指向的是Type类型对象(System.Type),而Type类型对象的类型对象指针指向它自己。而对象的GetType()方法返回的就是该对象中指向类型对象的类型对象指针。而Type类型对象在CLR加载到一个进程中时就创建了。如下图:
分享到:
相关推荐
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
《CLR基础入门教程》深入解析了CLR(Common Language Runtime,公共语言运行时)的基本概念及其在.NET Framework中的作用。本书由瑞奇特(Jeffrey Richter)撰写,基于Microsoft Visual Studio 2010,.NET Framework...
- **类型安全性**:讲解CLR如何确保类型的完整性和安全性,防止类型混淆等错误的发生。 - **异常处理**:介绍CLR如何处理异常,以及开发者应该如何编写健壮的异常处理逻辑。 #### 四、其他关键知识点 除了上述提到...
- **类、接口与对象**:类和接口是CLR类型系统中的核心组成部分。CLR支持面向对象编程,并定义了类和接口如何被声明和使用。 - **装箱与拆箱**:为了实现值类型与引用类型的转换,CLR引入了装箱和拆箱的概念。 - ...
- 支持类型安全性:CLR会在编译过程中进行类型检查。 - **IL的生成过程**: - .NET编译器将源代码编译成IL。 - IL通常存储在程序集中。 - 在程序运行时,CLR会将IL编译成本地机器码。 #### 七、.NET Framework...
“CLR via C# 第4版.pdf”作为一本专业书籍,旨在帮助读者深入了解C#语言与CLR之间的内在联系,通过学习这本书,不仅可以掌握C#编程的基础知识,还能深入了解.NET Framework的工作原理,从而提高编写高质量、高性能...
SQLSysClrTypes.msi包含的这些CLR类型是Report Viewer运行时与SQL Server进行通信的关键桥梁。 在标签中,“wsus”指的是Windows Server Update Services,这是一个服务器角色,允许管理员分发和管理Microsoft产品...
该书中文版通过深入浅出的方式,全面地介绍了CLR的基础知识、高级特性和实践应用,是学习.NET框架和C#语言不可或缺的参考书籍之一。 ### 关键知识点概览 #### 1. 公共语言运行时(CLR) 公共语言运行时(CLR)是.NET...
1. **CLR基础**:讲解了CLR的基本架构,如何管理内存(垃圾回收机制),以及类型系统和对象生命周期。 2. **C#语言特性**:深入解析C#的关键特性和语法,如委托、事件、属性、索引器、运算符重载、访问修饰符等,...
CLR是.NET Framework的核心组成部分,它为开发跨平台、高性能的应用程序提供了基础。这本教程针对的是对.NET编程有基本了解,并希望深入学习如何在C++环境中利用CLR特性的开发者。 首先,我们要理解什么是CLR。它是...
最后,文档可能还会介绍如何使用CLR的类型系统,它是.NET框架的基础,支持面向对象编程,包括类、接口、继承、多态等概念。类型安全是CLR的一个重要特性,它确保了代码在运行时不会意外地访问不正确的数据类型。 总...
第 l 部分介绍 CLR 基础.分介 tlI 从本类贬.第 I ' V 部分以核心机制为毛脱,并结合实例介绍了如何利用它们进行第 【 I 部分解释如何设计类型,第 m 部第 V 部分吸点介绍线程处理。通过木书的阅读.读者. 11 以掌...
2. 类型基础(Part 2-Type Basics) 这部分的代码涵盖了C#中的类、接口、结构、枚举、委托、事件和属性等基本类型。你可以学习到如何定义和使用这些类型,以及它们在.NET框架中的工作原理。 3. 核心类型(Part 4-...
《CLR via C#(第3版)》深入、全面探讨.NET Framework、CLR和多核编程,广泛讨论Framework Class Library(FCL)核心类型,对泛型和线程处理等深奥难懂的开发概念提供权威、实用的指导 自下而上,由浅入深掌握CLR和...
C#中的类型系统与CLR紧密结合,支持引用类型和值类型,以及类型继承和多态性。 六、异常处理 在C#中,异常处理是通过try-catch-finally语句块实现的。CLR支持异常的传播和捕获,提供了统一的错误处理机制,增强了...
CLR是.NET框架的核心,它是实现跨语言互操作性的基础,提供了诸如内存管理、类型安全、异常处理和多线程等服务。通过C#语言,开发者可以直接与CLR交互,编写高性能的应用程序。此书不仅涵盖了C#编程的基础知识,更...