首页 > 代码库 > C#的new操作符到底做了什么
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回收
C#的new操作符到底做了什么
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。