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回收

时间: 2024-10-03 13:29:54

C#的new操作符到底做了什么的相关文章

罗永浩到底做错了什么?

老罗的锤子一直以来都是不温不火,最近给别人都有"卖身阿里"的感觉了,和雷军的小米等其他国内手机品牌厂商相比,老罗还是挺失败的,为什么老罗的锤子卖不动呢? 今天企业纽带线CRM系统小编要跟大家聊的是罗永浩到底做错了什么. 1:把情怀估值太高----附加值变现时机太早 3000多到2000,情怀怎么也值1000吧? 错!情怀是要包裹在"性价比""占便宜""投资少回报大"的包装里才能出售的. 不然你多新鲜的情怀,多有机无害非转基因的

open_window()到底做了什么?

1 Hlong MainWndID= (Hlong)m_hWnd; 2 open_framegrabber("File", 4, 4, 0, 0, 0, 0, "default", -1, "default", -1, "default", 3 "", "default", -1, -1, &AcqHandle); 4 grab_image(&Image, AcqHand

AFNetworking到底做了什么?

前言 作为一个iOS开发,也许你不知道NSUrlRequest.不知道NSUrlConnection.也不知道NSURLSession...(说不下去了...怎么会什么都不知道...)但是你一定知道AFNetworking. 大多数人习惯了只要是请求网络都用AF,但是你真的知道AF做了什么吗?为什么我们不用原生的NSURLSession而选择AFNetworking? 本文将从源码的角度去分析AF的实际作用. 先从最新的AF3.x讲起吧: 首先,我们就一起分析一下该框架的组成. 将AF下载导入工

转Rollback后undo到底做了些什么?

转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些undo信息将数据还原到修改前的样子.Redo用于在失败时还原事务(即恢复事务),undo则用于取消一条语句或者一组语句的作用.与redo不同,undo在数据库内

【记录】New操作符所做的事情

1.它计算类型以及所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数.堆上的每个对象都需要一些额外的成员---即“类型对象指针”和“同步块索引”. 这些成员由CLR用于管理对象.这些额外成员的字节数会计入对象大小. 2.它从托管堆中分配制定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0. 3.它初始化对象的“类型对象指针”和“同步块索引”成员. 4.调用类型的实力构造器,向其传入在对new的调用中指定的任何实参.大多数编译器

new到底做了什么?

下面是一个实例化自定义的对象,我们将要对他进行分析 //定义构造函数 function A(){ this.b = 1 //在这个对象里增加一个属性 //不可以拥有返回对象的return语句 } var obj = new A() //实例化一个对象 console.log(obj) //{ b: 1 } 在这个过程中new到底做了什么? 下面针对分析new A(): 1.构造函数拥有一个叫prototype的属性,这里即A.prototype,这个对象默认有一个属性constructor,他的

SQL 中的 EXISTS 到底做了什么?

本文中提到的所有数据表基于王珊<数据库系统概论(第4版)>. 个人认为 SQL 中的 EXISTS 关键字对于初学者来说是比较难理解的一个,尤其是多个 EXISTS 子句的嵌套.我就写篇小文章,来简单地来解释下 EXISTS 到底做了些什么. 我们先从 SQL 中最基础的 WHERE 子句开始. 比如下面这条 SQL 语句: 很显然,在执行这条 SQL 语句的时候,DBMS 会扫描 Student 表中的每一条记录,然后把符合 Sdept = 'IS' 这个条件的所有记录筛选出来,并放到结果集

MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙

定投6年以亏损收场,他到底做错了什么

定投6年,以亏损收场,她到底做错了什么? 今天听了一个惨烈的故事.球仔一同学,从2010年开始定投某只基金,每个月8号投300块钱,坚持了整整六年,昨天终于全部赎回,以净亏损200多收场.她自己觉得还挺高兴的,觉得每个月省300块钱,坚持下来竟然在基金账户里面攒了几万. 球仔却不以为然.这明显是一个很凄凉的故事嘛!因为她的定投,收益率曾经高达50%以上.可惜她没有取出,眼睁睁看着收益全部跌没了. 哦!不对!还不是眼睁睁,她是设定了定投之后,每个月就让它从银行卡扣钱,六年时间都没去管收益如何.球仔