.net详细.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.net详细

同名笔记《你必须知道的.net》(二) 继承的本质与引用类型内存机制 上一篇博文也说了一点关于内存的知识,但是不详尽,这篇博文彻底的理解了从.net层面理解 引用类型的内存分配---引用类型的堆内的工作,以及继承的本质。(说的不对,大家指正)继承面向对象:实现单继承和接口多继承对于.net通过访问权限的修饰符控制安全:public protected internal private抽象方法和虚方法才可以被重写override,而且虚方法不能是private才可以被重写,抽象方法必须是public.接口的默认是公共抽象的方法,而且被继承了,必须被实现。1.继承机制的执行View Code public abstract class Animal { public abstract void ShowType(); public void Eat() { Console.WriteLine(Animal always eat.); } } public class Bird : Animal { private string type = Bird; public override void ShowType() { Console.WriteLine(Type is {0}, type); } private string color; public string Color { get { return color; } set { color = value; } } } public class Chicken : Bird { private string type = Chicken; public override void ShowType() { Console.WriteLine(Type is {0}, type); } public void ShowColor() { Console.WriteLine(Color is {0}, Color); } } public class TestInheritance { public static void Main() { Bird bird = new Bird(); Chicken chicken = new Chicken(); } }javascript:void(0);复制代码分析:1.程序入口依旧是 Main函数,当 Bird bird;时,堆栈中为bird分配4字节的内存存储指针指向堆中的对象实例地址。2.new Bird()时,如下:2.1先计算需要在堆中分配的内存,计算内存是从子类开始---基类结束。2.2调用构造函数,构造Bird类型的Type对象,静态方法,方法表,接口等,分配在Load Heap上,所以方法表式优先于对象分配内存的。只有用到的类的方法表才会被加载进Load堆。注:任何类型方法表中,开始的4个方法总是继承自System.Object类型的虚方法,它们是:ToString、Equals、GetHashCode和Finalize。2.3 初始化Bird的两个附加成员:TypeHandle和SyncBlockIndex。2.4调用构造器,进行实例字段的初始化,初始化的过程是从基类-父类-子类。(由上一篇图可知,是向高位扩展的方式,所以附件成员在下,字段在上)字段的排序是:父类的字段在子类的字段前面,如果同名编译器会认为是不同的字段。2.5 IL代码newobj分配内存的地址将传递给引用变量:bird变量。注意:方法表是在类第一次加载到AppDomain完成的,而且生命周期是直到AppDomain被卸载。如果再有新的对象实例被创建,只是将对象的附件成员TypeHandle指向方法列表的Load Heap地址上。3.当Chicken chicken时,大致是一样的,但是会把父类的方法复制一份,然后与自己的方法列表比较,是否覆盖4. new Chicken()时,同上。注意:而且为对象实例分配内存,堆中式由下而上的,向高位扩展,类似于NextObjPtr指针是向上移动的。而在堆栈中,堆栈指针式向下移动的。在回收内存时,必须GC堆被回收后才会回收Load堆。结论:对于堆栈,是向低位扩展,所以指针是向下移动的。对于GC堆,对象的实例是向高位扩展的,所以指针是向上移动,但是对于初始化实例,存储过程是在对象所占内存中是由上到下,即在GC堆内部父类字段在前,子类字段在后。对于Load堆是属于堆的,所有也是从低位向高位扩展存储分配,对于Load堆内部的方法表父类的方法在前,子类的方法在后。任何类型方法表中,开始的4个方法总是继承自System.Object类型的虚方法,它们是:ToString、Equals、GetHashCode和Final

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档