微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何证明拳击导致在堆中存储变量而不是堆栈?

我怎样才能证明拳击导致在堆中存储变量而不是堆栈?

boxing

我想要一些代码向我的学生展示拳击导致在堆中存储变量而不是堆栈.

Boxing and Unboxing

解决方法

很难区分堆和堆栈对象(这是有意的,因为.NET希望从程序员那里隐藏这个实现细节).

您可以采取的一种方法是比较基于地址的default hash codes个盒装对象,并观察它们不断变化(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的堆栈帧中,因为堆栈帧不会增长,但所有对象都具有不同的地址(认哈希码).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐