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

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

概述阅读 ValueTypes – RefTypes – EricLippert后我有3个问题: 因为说’int’派生自System.ValueType,派生自System.Object, 那么像’int’这样的值类型确实占用了多少空间(看到它最终来自System.Object)? 它只是int的大小或用于区分它是值类型的额外CLR簿记字段. ‘int’和’object’之间的大小差异? 当’int’ 阅读 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 }
总结

以上是内存溢出为你收集整理的.net – C#值类型的盒装.有关拳击包装和值类型的大小和类型的问题全部内容,希望文章能够帮你解决.net – C#值类型的盒装.有关拳击包装和值类型的大小和类型的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1245860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存