微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.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).

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

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

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

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

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

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

原文地址:https://www.jb51.cc/csharp/100367.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐