在C#中,声明局部字符串常量是否比声明局部变量有益?

3

在使用常量和字符串时,是否有明显的性能优势?假设以下情况:

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

  //some operations using searchedText string
}

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

  //some operations using searchedText string
}

还有一个选项是将其转换为类结构常量字段。

或者,我应该避免过于深入地考虑这些微观优化吗?


3
只有在存在明显可测的性能问题时才进行优化。即使存在问题,也要找到性能瓶颈并仅对其进行优化。 - Kevin
如果有的话,这将是非常极端的“优化”——两个字符串都将被池化(interned),在运行时你将得到相同的引用。如果你使用优化编译两个例子并查看中间语言(IL)代码,它们是相同的。 - Scott
3
在程序正确性方面有所不同。通过声明常量,你的意图很明确:这是一个静态值,不是一个可以在代码中间设置为不同值的变量。 - hatchet - done with SOverflow
1
@Scott:在标准、安全的C#代码约束下,改变字符串的值仍然是不可能的。string类型是不可变的。要改变string实例的值,需要故意绕过语言语义,使用反射或其他恶意手段。 - Peter Duniho
1
有一种优化永远不会过早:为可读性进行优化。如果一个变量打算是不可变的,请使用const来传达这个意图。@hatchet: 无论哪种方式,程序都是正确的。在程序的正确性方面根本没有差别。 - IInspectable
显示剩余4条评论
1个回答

1
如果你仔细想一下,它其实并没有太大的不同。这是因为当计算机看到一个变量时,它会检索它的内存地址,然后再获取值。我尝试过这段代码,差别非常微小(不到3毫秒:顺便说一句,代码运行时间约为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和non const的区别在于:该值是否始终保持不变:将其设置为const,否则请勿更改。这里有一篇关于.NET优化的链接
总之,只有在您的代码无法通过其他方式进行优化时,才应该涉及这些微小的细节,而在这种情况下,您的代码就很好了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接