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和.NET Framework的精髓,轻松、高效地...
第 l 部分介绍 CLR 基础.分介 tlI 从本类贬.第 I ' V 部分以核心机制为毛脱,并结合实例介绍了如何利用它们进行第 【 I 部分解释如何设计类型,第 m 部第 V 部分吸点介绍线程处理。通过木书的阅读.读者. 11 以掌...
clr-via-csharp针对CLR和.NET Framework 4.0进行深入、全面的探讨,并结合...第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。
第Ⅰ部分介绍CLR基础,第Ⅱ 部分解释如何设计类型,第Ⅲ部分介绍基本类型,第 Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处 理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高...
第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能...
第Ⅰ部分介绍CLR基础,第Ⅱ 部分解释如何设计类型,第Ⅲ部分介绍基本类型,第 Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处 理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高...
《CLR via C#(第3版)》深入、全面探讨.NET Framework、CLR和多核编程,广泛讨论Framework Class Library(FCL)核心类型,对泛型和线程处理等深奥难懂的开发概念提供权威、实用的指导 自下而上,由浅入深掌握CLR和...
第Ⅰ部分介绍clr基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。 通过本书的阅读,读者可以掌握clr和.net framework的精髓,轻松、高效地...
第ⅰ部分介绍clr基础,第ⅱ部分解释如何设计类型,第ⅲ部分介绍基本类型,第ⅳ部分以实用特性为主题,第ⅴ部分花大量篇幅重点介绍线程处理。 通过本书的阅读,读者可以掌握clr和.net framework的精髓,轻松、高效...
· 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理内存资源的 · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 ...
第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地...
第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能...
本书针对clr和.net framework 4.0进行深入、全面的探讨,并结合实例介绍了...第Ⅰ部分介绍clr基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。
第Ⅰ部分介绍CLR基础,第Ⅱ 部分解释如何设计类型,第Ⅲ部分介绍基本类型,第 Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处 理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高...
第4章 类型基础 第5章 基元、引用和值类型 第Ⅲ部分 类型的设计 第6章 类型和成员基础 第7章 常量和字段 第8章 方法:构造器、操作符、转换操作符和参数 第9章 属性 第10章 事件 第Ⅳ部分 基本类型
CLR via C# 第3版 中文版 此为压缩卷第3部分,共4部分 本书针对CLR和.NET Framework 4.0进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。...第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型