C# “A”是什么意思;int";分配给一个对象?
如何在.NET中为对象分配整数 引用类型派生自System。对象和值类型派生自System.ValueType 那么,这怎么可能呢?您是对象中的整数C# “A”是什么意思;int";分配给一个对象?,c#,.net,types,C#,.net,Types,如何在.NET中为对象分配整数 引用类型派生自System。对象和值类型派生自System.ValueType 那么,这怎么可能呢?您是对象中的整数 也就是说,将创建一个包装(或装箱)整数的对象。有点像在现实生活中把东西放进盒子里。这是通过装箱和拆箱的过程来完成的。请参阅以下链接以获取更多参考: int在.NET中有一个基础整数类型对象和一个隐式转换。: 装箱是将值类型转换为类型对象或该值类型实现的任何接口类型的过程。当CLR装箱一个值类型时,它将该值包装在System.Object中,并将
也就是说,将创建一个包装(或装箱)整数的对象。有点像在现实生活中把东西放进盒子里。这是通过
装箱
和拆箱
的过程来完成的。请参阅以下链接以获取更多参考:
int在.NET中有一个基础整数类型对象和一个隐式转换。: 装箱是将值类型转换为类型对象或该值类型实现的任何接口类型的过程。当CLR装箱一个值类型时,它将该值包装在System.Object中,并将其存储在托管堆中。取消装箱从对象中提取值类型 如果你看一下,它也来自
System.Object
另请参见您应该阅读c#中的内容,它应该告诉您他们是如何/为什么的
此链接提供了很好的解释,并解释了您所问的参考与价值类型问题:
装箱就是简单地将一个基本类型放入包装器(使其成为一个完整的对象),然后取消装箱,将包装的对象转换回一个更简单的类型。要执行装箱操作,需要在堆上分配托管内存,需要更新引用,并且必须复制值类型的内容
System.ValueType也是从System.Object派生的,因此: 请参见此处的继承层次结构: 尝试以下方法:
object ob;
int i=10;
ob=i;//(boxing)
int b;
b=(int)ob;//(unboxing)
术语“装箱”非常不透明,但使用调试器很容易将实际发生的情况可视化。编写一个小型控制台模式应用程序,如下所示:
using System;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
int value = 42;
object obj = value;
} // <== Breakpoint here
}
}
这里有趣的部分是0x01CBF6BC,这是垃圾收集堆上对象的地址。下一个十六进制数6e1a2d34是所谓的“类型句柄”,也称为“方法表指针”。这是一个标识对象类型的“cookie”。在本例中为System.Int32。非常重要的是,稍后将对象解装箱回Int32时将使用它来验证装箱的值实际上是整数
您看到的下一个值0000002a是装箱对象的值。您可以使用Windows计算器在程序员模式下转换回十进制,它是42
使用不同的值和不同的类型进行实验,看看它如何影响已装箱的对象。您可以修改十六进制,并查看它对调试器显示的obj值有何影响
我给你的十六进制转储是一个4字节的装箱值,装箱一个双精度将需要8字节。装箱结构将占用更多字节。还有一部分你看不到的对象头,所谓的syncblock,位于地址-4。尝试使用lock语句查看这种变化。装箱是一种物理现象。这实际上是如何发生的(integer不属于System.Object)?dtb引用了同一文档中的话,很好地总结了这一点。我认为您将.NET与Java混淆了。没有任何隐含的转换;它仍然是一个int,伪装成一个对象。哦,是的,我做了。这就是我在发布之前没有花时间思考的原因。事实上,由于奇怪的情况,pwny是对的。net中的
int
类型(以及其他数字类型)是一种“神奇”类型:仅int
值就只有4个字节,这意味着它不能有RTTI。只有当您尝试将其用作对象(例如装箱时)时,才会将其放入System.Integer
实例中,该实例只是一个包装器。如果通过Reflector查看System.Integer
类,您将看到它的唯一成员是int m_value
。所以有一个隐式转换正在进行,唯一的事情是它发生在一个比预期更低的级别。@BoltClock,或者至少,当我问为什么系统时,有人告诉我。Integer
包含一个int
:
0x01CBF6BC 6e1a2d34 0000002a