哪个更有效:代码中的硬编码字符串 - 或 - 重用字符串引用?

时间:2011-07-18 11:01:37

标签: c# string

想知道以下哪个选项效率更高。有什么建议吗?

清单1

string header = "Header 1"; // create a string variable and reuse
client.AddMessage(header, ...);
client.AddMessage(header, ...);
client.AddMessage(header, ...);
client.AddMessage(header, ...);
client.AddMessage(header, ...);
...

清单2

client.AddMessage("Header 1", ...); // hard code the string in each call
client.AddMessage("Header 1", ...);
client.AddMessage("Header 1", ...);
client.AddMessage("Header 1", ...);
client.AddMessage("Header 1", ...);
....

8 个答案:

答案 0 :(得分:6)

您可能不应该关心这种(可能)微优化:重要的是,这里是可维护性:

  • 你只有一个字符串吗?
  • 或者你可以在一天之内有几个不同的价值观吗?


(编译器应该为你优化,无论如何,我想)

答案 1 :(得分:3)

.NET世界中的字符串是interned,因此任何一个都可以以相同的方式工作。

换句话说 - 它在性能方面没有任何区别。

至于可维护性 - 如果您需要更改标题名称,则选项1更好(DRY)。

答案 2 :(得分:3)

我怀疑其中有多少,但清单1我会说,因为清单2中的所有单个字符串都必须依次创建,除非优化器在幕后做事。

我已经使用了版本1但是如果值不改变则使用const。

const string HEADER  = "Header 1";

答案 3 :(得分:0)

将重复使用字符串(interned)。所以他们应该同样有效率。我认为清单1更易于维护。

答案 4 :(得分:0)

两者都是一样的。字符串被实习。

答案 5 :(得分:0)

我不是100%肯定,但我认为你可以在你的字符串声明中添加const,如果你想要更多的性能,但我认为你不会看到任何可衡量的差异......

但是清单1有一个好处,你只需更改代码的一部分即可更改值...

答案 6 :(得分:0)

第一个选项对于重构更有效率,如果您希望更改代码,则只需更改一行。另外,如果它总是与编译时定义的值相同,您可能需要考虑使用常量。

答案 7 :(得分:0)

如果你真的相信这段代码是一个性能瓶颈,你应该尝试两种方式,配置文件,然后你知道哪个更有效。

如果您不够谨慎测量,请不要优化

如果你只是出于好奇心问,Strings get interned in .NET所以从性能角度来看它是完全一样的 - 也就是说不要做第二个因为那么那个必须维护它的人会杀了你。< / p>