引自 MSDN Link for ValueType Class

这意味着当我像“integerVariable.ToString();”这样的代码时创建的包装对象允许使用此方法以及 System.Object 的所有其他方法。

提前致谢。

最佳答案

包装器是一个“盒子”;重新对盒子进行垃圾收集 - 就垃圾收集器而言, 没有区别。一个盒子的收集规则和处理与任何其他对象完全相同。

然而,如果一个值类型覆盖了一个方法(例如 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(因为它没有(不能)被覆盖)

关于.net - ValueType 包装器的垃圾收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/415995/

10-12 00:01
查看更多