【问题标题】:Is there any benefit on declaring a local constant of string over a local variable C# [closed]在局部变量C#上声明字符串的局部常量有什么好处[关闭]
【发布时间】:2018-02-20 04:01:38
【问题描述】:

在字符串上使用常量是否有任何明显的好处。假设以下情况

public void MethodUsingConstant()
{
  const string searchedText = "foo";

  //some operations using searchedText string
}

public void MethodNoUsingConstant()
{
  string searchedText = "foo";

  //some operations using searchedText string
}

还有一个选项可以把它带到一个类结构常量字段中。

或者,我应该避免过多地考虑这些微优化吗?

【问题讨论】:

  • 仅在您有可证明、可衡量的性能问题时进行优化。即便如此,也要找到性能瓶颈并仅对其进行优化。
  • 如果有的话,这将是一个非常极端的“优化”——两个字符串都将被保留,并且无论如何您将在运行时获得相同的引用。如果您使用优化编译两个示例并查看 IL,它们是相同的。
  • 在程序正确性方面存在差异。通过声明为常量,您的意图很明确:这是一个静态值,而不是可以在代码中途设置为不同值的变量。
  • @Scott:“仍然可以更改字符串的值”——不受标准、安全的 C# 代码的限制。 string 类型是不可变的。要更改 string 实例的值,需要通过反射或其他恶意手段故意绕过语言语义。
  • 有一个优化永远不会为时过早:优化可读性。如果一个变量打算是不可变的,则通过将其设为const 来传达该意图。 @hatchet:无论哪种方式,该程序都是正确的。在程序正确性方面完全没有区别。

标签: c# .net string performance clr


【解决方案1】:

如果你仔细想想,它应该不会有太大的不同。这是因为当计算机看到一个变量时,它会先检索其内存地址,然后再检索其值。我已经尝试过这段代码,但差异是如此之小(不到 3 毫秒:BTW 代码在约 107 毫秒内运行)可能取决于数百万个其他变量:

        //Just changed to non const
        const string s = "hello";

        string full = "";

        int k = 0;

        for(int i = 0; i < 10000; i++)
        {
            full += s;
        }

一般来说,const 与非 const 只是归结为:该值是否始终保持不变:将其设置为 const,否则就保留它。这是一个很棒的link about .NET optimization

总而言之,你应该只在你的代码无法以任何其他方式优化的时候进入这些微小的细节,在这种情况下,你的代码就很好了。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多