• 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(){}
    
        }
    

    9

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

     

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

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

  • 相关阅读:
    Activity的生命周期和启动模式
    网络基础1
    Jersey用户指南学习笔记1
    IntelliJ IDEA + Maven + Jetty + Jersey搭建RESTful服务
    Java并发编程实战笔记—— 并发编程4
    Java并发编程实战笔记—— 并发编程3
    Java并发编程实战笔记—— 并发编程2
    7.2.4
    7.2.4
    7.2.3
  • 原文地址:https://www.cnblogs.com/darrenji/p/3994138.html
Copyright © 2020-2023  润新知