引用自ValueType 类的 MSDN 链接 http://msdn.microsoft.com/en-us/library/system.valuetype.aspx
如果值类型需要像对象一样运行,则会在堆上分配一个使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。包装器被标记,以便系统知道它包含值类型。
这意味着当我编写“integerVariable.ToString();”之类的代码时创建的包装对象允许使用此方法以及类似的 System.Object 的所有其他方法。
这种理解正确吗?
这些物体与“常规”物体有何不同?
对于此类对象,垃圾收集是否有所不同?如果是,怎么办?
提前致谢。
包装纸是一个“盒子”;重新收集垃圾箱 - 有no就垃圾收集器而言,差异。盒子的收集规则和处理方式与任何其他物体完全相同。
但是,如果值类型重写方法(例如ToString()
),调用该方法时无需对其进行装箱。因此,值类型应该(作为惯例)覆盖尽可能多的object
尽可能的方法;-p
您可以看到 IL 中的差异(通过反射器) - 因此对于 C#:
static int GetInteger() {return 123;}
static string TestToString() {
int i = GetInteger(); // to prove no cheating
return i.ToString();
}
static Type TestGetType() {
int i = GetInteger(); // to prove no cheating
return i.GetType();
}
我们有 IL:
.method private hidebysig static string TestToString() cil managed
{
.maxstack 1
.locals init (
[0] int32 i)
L_0000: call int32 Program::GetInteger()
L_0005: stloc.0
L_0006: ldloca.s i
L_0008: call instance string [mscorlib]System.Int32::ToString()
L_000d: ret
}
.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
.maxstack 1
.locals init (
[0] int32 i)
L_0000: call int32 Program::GetInteger()
L_0005: stloc.0
L_0006: ldloc.0
L_0007: box int32
L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
L_0011: ret
}
注意ToString()
不涉及盒子,但是GetType()
做在L_0007
(因为它没有(不能)被覆盖)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)