【问题标题】:Does the compiler reuse const variable declared inside method编译器是否重用在方法内声明的 const 变量
【发布时间】:2018-01-24 21:56:12
【问题描述】:
class foo
{
    string bar()
    {
        const string c = "dead beef";
        return c;
    }

    void Test()
    {
        string a = bar();
        string b = bar();
    }
}

ab 是不同的实例还是指向相同的内存地址? (== 比较会返回 true,无论它们是否是同一个实例,所以我无法真正测试它)

【问题讨论】:

  • 字符串是不可变的,所以你不需要知道或关心。您可以使用Object.ReferenceEquals 来查找。
  • @Blorgbeard 想知道我是否为将被调用数百万次的方法节省了一些资源
  • @Steve 然后测量运行您的方法数百万次需要多长时间,看看更改实现是否会改变时间。
  • 如果您想查看本地 const 变量在生成的 IL 上的差异,请查看我在 09 年提出的问题 - stackoverflow.com/questions/1707959/…
  • Imo,无论如何这都会被内联,所以没关系。电话永远不会发生。

标签: c#


【解决方案1】:

不,但对于大多数情况来说并不重要。

对于结构(intfloatDateTime 等),该值将放在堆栈上,因此与内存重用无关。

对于字符串, const 没有做任何特殊的事情,但字符串常量本身是内部的,因此所有匹配的常量字符串值都将指向内存中的同一个实例。

【讨论】:

  • 有趣。这就是为什么 Object.ReferenceEquals(a, b) 返回 true 或 string 但不返回 int
  • 因为 int 不是对象,所以它们将被装箱到(单独的)对象包装器中,以便它们可以传递给 ReferenceEquals。
猜你喜欢
  • 2011-01-11
  • 2017-06-09
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多