加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:01:42 所属栏目:百科 来源:网络整理
导读:阅读 ValueTypes – RefTypes – EricLippert后我有3个问题: 因为说’int’派生自System.ValueType,派生自System.Object, 那么像’int’这样的值类型确实占用了多少空间(看到它最终来自System.Object)? 它只是int的大小或用于区分它是值类型的额外CLR簿记
阅读 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 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读