C#的new操作符到底做了什么_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#的new操作符到底做了什么

C#的new操作符到底做了什么

 2014/9/26 10:14:04  Darren Ji  程序员俱乐部  我要评论(0)
  • 摘要:使用new操作符来创建对象,其背后到底发生了什么?有一个父类Animal,Dog派生于Animal。classProgram{staticvoidMain(string[]args){Dogdog=newDog();Console.WriteLine("我能调用老祖宗Object的实例方法GetType,显示结果为:"+dog.GetType());Console.WriteLine("我能拿到父类的属性Age="+dog.Age);Console.WriteLine
  • 标签:C# 什么 操作 操作符

使用newcaozuofu.html" target="_blank">操作符来创建对象,其背后到底发生了什么?

 

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

monospace; width: 100%; margin: 0em; background-color: #f0f0f0">    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(){}
    }

9

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

 

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

→计算Dog类以及所有父类实例字段所占的字节数
→计算Dog类以及所有父类"类型对象指针"和"同步块索引"所占的字节数
→根据字节数,托管堆分配内存
→先调用所有父类的构造函数,最后调用Dog的构造函数。在这过程中,初始化所有实例字段,字段值为字段类型的默认值或构造函数实参值;初始化"类型对象指针"和"同步块索引"成员
→把新建的Dog实例的堆地址赋值给栈变量dog
→通过new创建的托管堆对象最终由GC回收

发表评论
用户名: 匿名