C#中new操作符的工作机制

使用new操作符来创建对象,其背后到底发生了什么?

有一个父类Animal,Dog派生于Animal。

class Program { static void Main(string[] args) { Dog dog = new Dog(); Console.WriteLine("我能调用老祖宗Object的实例方法GetType,显示结果为:" + dog.GetType() ); Console.WriteLine("我能拿到父类的属性Age=" + dog.Age); Console.WriteLine("我当然能拿到自己的公共字段_weight=" + dog._weight); } } public class Animal { public int Age { get; set; } public Animal(){} } public class Dog : Animal { public decimal _weight; public Dog(){} }

虽然创建了子类Dog的实例,但通过dog实例能调用"老祖宗"System.Object的实例方法,也能获取到父类的公共属性Age的值,并且所有的实例字段值为其类型的默认值。

new操作符做的事情大致包括:

计算Dog类以及所有父类实例字段所占的字节数

计算Dog类以及所有父类"类型对象指针"和"同步块索引"所占的字节数

根据字节数,托管堆分配内存

先调用所有父类的构造函数,最后调用Dog的构造函数。在这过程中,初始化所有实例字段,字段值为字段类型的默认值或构造函数实参值;初始化"类型对象指针"和"同步块索引"成员

把新建的Dog实例的堆地址赋值给栈变量dog

通过new创建的托管堆对象最终由GC回收

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易知道(ezd.cc)的支持。如果你想了解更多相关内容请查看下面相关链接

推荐阅读

    new3ds电脑读取|new3ds怎么连接电脑

    new3ds电脑读取|new3ds怎么连接电脑,,new3ds怎么连接电脑不能,3ds连电脑不能通过数据线,只能将存储卡用读卡器连电脑或者使用无线管理模式

    foreach的用法c语言和c#

    foreach的用法c语言和c#,数组,遍历,本文目录foreach的用法c语言和c#详细讲解foreach循环的用法C#中的foreach 怎么用啊foreach用法C#中的f

    锋哲New V6T怎么样

    锋哲New V6T怎么样,支持,锋哲,解码,芯片,视频,全高清,  锋哲New V6T支持全高清视频和音频解码,这要得益于它采用了RTD1185芯片,实乃解码之王。

    params 是什么意思,c#里

    params 是什么意思,c#里,参数,数组,本文目录params 是什么意思,c#里params.add跟params.put有区别吗C#中ref,out和params有什么区别发送请

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session,令牌,客户端,最近在研发一款O2O产品,考虑到分布式架构的需要,以前那一套.NET的

    c#中 (ToolStrip

    c#中 (ToolStrip,窗体,控件,本文目录c#中 (ToolStrip)控件是做什么用的winform窗体问题 toolstrip怎么重用,每个窗体都要用到同样的工具栏窗体

    C#取得DataTable最大值、最小值

    C#取得DataTable最大值、最小值,最大值,最小值,C#取得DataTable最大值、最小值int max=int.Parse((dtItemsAll.Compute("Max(CPITEMS_SOR