积极答复者
C# NEW操作符所做的事情

问题
-
在CLR via C# (第3版)这本书里看到第四章 类型基础这里的NEW操作符所做的事情这里,有几个问题看的不太明白
new操作符所做的事情:
1;它计算类型及其所有基类型(一直到system。object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要字节数,堆上的每个对象都需要一些额外的成员---即“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。这些成员由CLR用以管理对象。这些额外成员的字节数会计入对象大小。问题:这里的“同步块索引”是什么意思啊?在网上查了好多,可能是看不懂吧,希望在这里能得到答案,谢谢
2;它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设定为(0)。问题:这句话不明白是什么意思,为什么都设定为零那?
3;它初始化对象的“类型对象指针”和“同步块索引”成员。
4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”怎么理解啊?
这个问题卡了我好几天了,真心的希望得到解答,谢谢了!
答案
-
值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。
你好!
准确的来说,引用类型的对象的实例是保存在托管堆中的,其中包括这个类的成员字段(如果是引用类型的程序字段,保存的是引用,如果是值类型的字段,保存的是值本身),此外,还有一些隐藏的成员字段,用于特殊的目的:
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
全部回复
-
在CLR via C# (第3版)这本书里看到第四章 类型基础这里的NEW操作符所做的事情这里,有几个问题看的不太明白
new操作符所做的事情:
1;它计算类型及其所有基类型(一直到system。object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要字节数,堆上的每个对象都需要一些额外的成员---即“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。这些成员由CLR用以管理对象。这些额外成员的字节数会计入对象大小。问题:这里的“同步块索引”是什么意思啊?在网上查了好多,可能是看不懂吧,希望在这里能得到答案,谢谢
2;它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设定为(0)。问题:这句话不明白是什么意思,为什么都设定为零那?
3;它初始化对象的“类型对象指针”和“同步块索引”成员。
4;调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。问题:这句话“向其传入在对new的调用中指定的任何实参”怎么理解啊?
这个问题卡了我好几天了,真心的希望得到解答,谢谢了!
- 已合并 Leo Liu - MSFTModerator 2011年4月9日 9:38 Totally the same.
-
值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。
你好!
准确的来说,引用类型的对象的实例是保存在托管堆中的,其中包括这个类的成员字段(如果是引用类型的程序字段,保存的是引用,如果是值类型的字段,保存的是值本身),此外,还有一些隐藏的成员字段,用于特殊的目的:
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
-
你好
或者 你可以參考以下的貼...有網友提供了答案了
Please correct me if my concept is wrong
Chi