.net – C#值类型的盒装.有关拳击包装和值类型的大小和类型的问题

前端之家收集整理的这篇文章主要介绍了.net – C#值类型的盒装.有关拳击包装和值类型的大小和类型的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读 ValueTypes – RefTypes – EricLippert后我有3个问题:

因为说’int’派生自System.ValueType,派生自System.Object,

那么像’int’这样的值类型确实占用了多少空间(看到它最终来自System.Object)?
它只是int的大小或用于区分它是值类型的额外CLR簿记字段.

‘int’和’object’之间的大小差异?

当’int’用包装器装箱时.那么包装器只是一个对象类型(并且该对象进入堆)的情况呢?这个包装器对象和普通新对象()之间的区别?包装器的大小/空间是多少?

解决方法

int是32位,无论如何,因为它是一个值.

对象部分仅在您装入它时才会起作用(例如,在C#中将其转换为对象).一旦发生这种情况,就会使用对象拥有的所有内容创建一个新对象,并在该对象内部驻留您的int.

这就是为什么C#泛型与Java相比如此惊人,因为你不会将值类型强制转换为对象只是为了将它们放在一个通用的容器中,所以值类型实际上是整个时间的值类型(或直到程序员变得懒惰)并开始抛出对象val = … around).

编辑:我可以理解这种困惑,因为他们对编译器的工作有多么惊人:

  1. var s=12.GetType(); // if it looks like an object and walks like an object...

但它不是一个对象,直到GetType调用,此时值被装入一个对象并在其上调用方法.

从Object派生的ValueType也是如此.只是编译器忽略的一些非常复杂的语法糖,并在你背后做了奇怪的事情:)

edit2:这是显示拳击的dissasembled代码

  1. .method private hidebysig static void Main(string[] args) cil managed
  2. {
  3. .entrypoint
  4. .maxstack 1
  5. .locals init (
  6. [0] class [mscorlib]System.Type s)
  7. L_0000: nop
  8. L_0001: ldc.i4.s 12
  9. L_0003: Box int32 // <---
  10. L_0008: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
  11. L_000d: stloc.0
  12. L_000e: ldloc.0
  13. L_000f: call void [mscorlib]System.Console::WriteLine(object)
  14. L_0014: nop
  15. L_0015: ret
  16. }

猜你在找的C#相关文章