如何将"int"分配给对象?

See*_*arp 9 .net c# types

我们如何在.NET中为一个对象分配一个整数?

引用类型派生自System.Object,值类型来自System.ValueType.

那么,怎么可能呢?

Han*_*ant 19

术语"装箱"非常不透明,但通过使用调试器可以很容易地看到实际发生的情况.写一个像这样的小控制台模式应用程序:

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            int value = 42;
            object obj = value;
        }  // <== Breakpoint here
    }
}
Run Code Online (Sandbox Code Playgroud)

在指示的位置设置断点并按F5.当断点命中时,使用Debug + Windows + Memory + Memory 1.在地址框中,键入"obj".您将获得对象的内存内容的十六进制转储.右键单击窗口并选择"4字节整数",这是在这种情况下可视化对象的最佳方法.你会看到类似这样的东西:

0x01CBF6BC  6e1a2d34 0000002a
Run Code Online (Sandbox Code Playgroud)

这里有趣的部分是0x01CBF6BC,这是垃圾收集堆上对象的地址.下一个十六进制数6e1a2d34是所谓的"类型句柄",也称为"方法表指针".这是一个标识对象类型的"cookie".在这种情况下,System.Int32.非常重要的是,稍后将对象取消装箱回Int32以验证盒装值实际上是整数时使用.

您看到的下一个值0000002a是盒装对象的值.你可以在程序员模式下使用Windows计算器转换回十进制,它是42.

试验一下,使用不同的值和不同的类型来查看它如何影响盒装对象.您可以修改十六进制,看看它对调试器显示的obj值有什么影响.

我给你的十六进制转储是一个4字节的盒装值,装箱一个double需要8个字节.装箱结构将需要更多的字节.还有一个你看不到的对象标题的一部分,即所谓的syncblock,位于地址 - 4.尝试使用lock语句来查看更改.


Pay*_*aya 13

这是通过的过程中完成的boxingunboxing.请参阅以下链接以获取进一步参考:

拳击和拆箱(C#编程指南)
价值类型的装箱和拆箱:你需要知道什么?
装箱/拆箱和铸造有什么区别?


dtb*_*dtb 7

拳击和拆箱:

Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程.当CLR选中一个值类型时,它将值包装在System.Object中并将其存储在托管堆上.取消装箱从对象中提取值类型.


Bol*_*ock 5

你是在一个对象中装箱整数.

也就是说,创建一个包装(或)整数的对象.有点像在现实生活中把东西放在盒子里.