我如何证明装箱导致将变量存储在堆而不是堆栈中?

How can I prove that boxing cause storing a variable in heap instead of stack?

如何证明装箱导致将变量存储在堆中而不是堆栈中?

我想要一些代码向我的学生展示装箱导致将变量存储在堆中而不是堆栈中。

Boxing and Unboxing

很难区分堆对象和堆栈对象(这是有意为之的,因为 .NET 想对程序员隐藏此实现细节)。

您可以采用的一种方法是比较 address-based default hash codes of boxed objects, and observe that they keep changing (demo):

static object MakeBoxed() {
    int n = 5;
    object a = n;
    return a;
}
public static void Main() {
    for (int i = 0 ; i != 10 ; i++) {
        object a = MakeBoxed();
        Console.WriteLine(RuntimeHelpers.GetHashCode(a));
    }
}

MakeBoxed内部创建的对象不能在栈上,因为MakeBoxed的栈帧在调用后被停用。此外,它们不能在 Main 的堆栈帧中,因为堆栈帧不会增长,但所有对象都有不同的地址(默认哈希码)。