gpt4 book ai didi

.net - ValueType 包装器的垃圾收集

转载 作者:行者123 更新时间:2023-12-01 10:16:26 25 4
gpt4 key购买 nike

引自MSDN Link for ValueType Class

In cases where it is necessary for a value type to behave like an object, a wrapper that makes the value type look like a reference object is allocated on the heap, and the value type's value is copied into it. The wrapper is marked so the system knows that it contains a value type.

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

Is this understanding correct?

How are these objects different from the 'regular' objects?

Is the Garbage Collection different for such object? If yes, how?

提前致谢。

最佳答案

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

但是,如果值类型覆盖了方法(例如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com