[C.C++] C#中new操作符的工作机制

2477 0
王子 2022-11-10 10:47:43 | 显示全部楼层 |阅读模式
使用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回收
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对中国红客联盟的支持。如果你想了解更多相关内容请查看下面相关链接

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行