none
C# NEW操作符所做的事情 RRS feed

  • 问题

  • 在CLR via C# (第3版)这本书里看到第四章 类型基础这里的NEW操作符所做的事情这里,有几个问题看的不太明白

    new操作符所做的事情:

    1;它计算类型及其所有基类型(一直到system。object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要字节数,堆上的每个对象都需要一些额外的成员---即“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。这些成员由CLR用以管理对象。这些额外成员的字节数会计入对象大小。问题:这里的“同步块索引”是什么意思啊?在网上查了好多,可能是看不懂吧,希望在这里能得到答案,谢谢

    2;它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设定为(0)。问题:这句话不明白是什么意思,为什么都设定为零那?

    3;它初始化对象的“类型对象指针”和“同步块索引”成员。

    4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”怎么理解啊?

    这个问题卡了我好几天了,真心的希望得到解答,谢谢了!

    2011年4月5日 3:04

答案

  • 值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。

    你好!
         准确的来说,引用类型的对象的实例是保存在托管堆中的,其中包括这个类的成员字段(如果是引用类型的程序字段,保存的是引用,如果是值类型的字段,保存的是值本身),此外,还有一些隐藏的成员字段,用于特殊的目的:
         MethodTable Ptr(方法表指针):用于方法调用
         Sync Block Index:(同步阻塞索引):用于线程的同步
         一个内部的字段(名字没有公开):用于计算对象实例的Hash值,每创建一个新的对象,这个值自动加1,然后就不能更改了,以保证Hash值的唯一性!
         一般后面的内容作为了解就可以了!希望这个解释对你有帮助!
    周雪峰
    2;它从托管堆中分配指定类型要求的字节数  ,--------这个是指值类型的初始化过程,所以是(0)

    3;它初始化对象的“类型对象指针”和“同步块索引”成员。----------初始化引用类型

    4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”------------是指带参数的new(obj obj) 所做的操作。因为传入的是参数的副本,所以要实例构造

    • 已建议为答案 Cookie Luo 2011年4月6日 7:27
    • 已标记为答案 Cookie Luo 2011年4月13日 9:16
    2011年4月5日 4:38

全部回复

  • 在CLR via C# (第3版)这本书里看到第四章 类型基础这里的NEW操作符所做的事情这里,有几个问题看的不太明白

    new操作符所做的事情:

    1;它计算类型及其所有基类型(一直到system。object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要字节数,堆上的每个对象都需要一些额外的成员---即“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。这些成员由CLR用以管理对象。这些额外成员的字节数会计入对象大小。问题:这里的“同步块索引”是什么意思啊?在网上查了好多,可能是看不懂吧,希望在这里能得到答案,谢谢

    2;它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设定为(0)。问题:这句话不明白是什么意思,为什么都设定为零那?

    3;它初始化对象的“类型对象指针”和“同步块索引”成员。

    4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”怎么理解啊?

    这个问题卡了我好几天了,真心的希望得到解答,谢谢了!

    2011年4月5日 4:13
  • 值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。

    你好!
         准确的来说,引用类型的对象的实例是保存在托管堆中的,其中包括这个类的成员字段(如果是引用类型的程序字段,保存的是引用,如果是值类型的字段,保存的是值本身),此外,还有一些隐藏的成员字段,用于特殊的目的:
         MethodTable Ptr(方法表指针):用于方法调用
         Sync Block Index:(同步阻塞索引):用于线程的同步
         一个内部的字段(名字没有公开):用于计算对象实例的Hash值,每创建一个新的对象,这个值自动加1,然后就不能更改了,以保证Hash值的唯一性!
         一般后面的内容作为了解就可以了!希望这个解释对你有帮助!
    周雪峰
    2;它从托管堆中分配指定类型要求的字节数  ,--------这个是指值类型的初始化过程,所以是(0)

    3;它初始化对象的“类型对象指针”和“同步块索引”成员。----------初始化引用类型

    4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”------------是指带参数的new(obj obj) 所做的操作。因为传入的是参数的副本,所以要实例构造

    • 已建议为答案 Cookie Luo 2011年4月6日 7:27
    • 已标记为答案 Cookie Luo 2011年4月13日 9:16
    2011年4月5日 4:38
  •     谢谢您的回复,刚刚我看了周雪峰的解释,里面深入理解值类型和引用类型,这是.NET开发人员取得长期成功的关键,下面从内存布局角度详细给大家说明一下值类型和引用类型:下面的图里面的0x30,0x40。。。。。。这些都是什么意思啊?
    2011年4月5日 7:52
  • 那个图是从 CLR via C# 中复制出来的,详细您可以去看书上的原版。

    另外,强烈建议您仔细阅读第四章: Type foudamentals,这非常重要,这对您是否能理解 .NET 的公共类型系统 (CTS) 起着决定性作用。


    Mark Zhou
    2011年4月5日 8:43
  •   好的  谢谢你

    2011年4月5日 11:22
  • 你好

    或者 你可以參考以下的貼...有網友提供了答案了

    http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/7bf853d7-7c5f-49ca-aadf-cb7ecf02ddce/#2645333f-fd84-4bc2-891a-59bec055b3dc

    Please correct me if my concept is wrong


    Chi
    2011年4月6日 20:41
    版主