分配给字符串对象时,为什么要使用string.Empty而不是“”


14

我一直在代码上运行StyleCop,建议SA1122之一是在为值分配空字符串时使用string.Empty而不是“”。

我的问题是为什么这被认为是最佳做法。或者,这被认为是最佳实践吗?我假设这两个语句之间没有编译器差异,所以我只能认为这是易读性吗?

所以问答

乔恩·斯凯特(Jon Skeet)回答问题


5
我确定这是在Stack Overflow上被询问和回答的-但是我在查找它时遇到了麻烦。这是一个事实,即它必须实例化一个新的字符串对象做"",但不是string.Empty
ChrisF

@ChrisF啊,没想到要针对此类问题查看堆栈溢出。我要a雄。
dreza 2012年

1
问题的计算器上DUP:stackoverflow.com/questions/151472/...
昆廷-盯着

@ChrisF-已经有人问过。 ...
奥德

1
在这里,我们去- stackoverflow.com/questions/151472/... -回从2008年9月
ChrisF

Answers:


12

一个有效的原因是,它清楚地表明这不是错别字或占位符,您确实打算在此处使用空字符串。

我不知道它是否被认为是“最佳实践”。


7

我想有两个原因,一个是为了提高可读性,另一个是为了提高性能。

可读性很容易:string.Empty比识别起来要快得多""string.Empty与查找文字相比,搜索通常也将更容易且可能更准确。它还阐明了意图:您不只是打错字或忘记完成某些操作,而是确实想要空字符串。

性能原因是由于实习。您会看到,运行时保留了以前使用过的字符串的表,因此它可以快速进行字符串比较,而无需实际进行逐字符检查。 string.Empty已经成为对""where 的实习生引用,因为键入文字可能无法为您提供实习生版本,从而对性能造成轻微影响。


7
至少从.Net 2起,一个nitpick键入文字“”将始终为您提供相同的“”中间版本。
quentin-starin 2012年

正确,关于MSDN的实习文章在这一点上很难理解。它看起来确实像是“”和string.Empty都应该指向同一个内部字符串,但是似乎表明.net运行时版本之间存在一些差异。我认为在代码中多次出现的任何字符串文字都将在第二次被进一步使用,是吗?
CodexArcanum 2012年

4
我还要强调一点,当我说轻微时,我的意思是超级小。“由于性能”并不是从一种表示形式切换到另一种表示形式的理由,这只是一个值得了解的运行时整洁的东西。
CodexArcanum 2012年

4
还应注意,性能方面仅适用于编译。由于两者都编译为相同的IL,因此运行时性能应相同。
lzcd 2012年

性能的提升只能靠编译
棘手的怪胎

4

string.Empty 在一个极端的情况下获胜,这可能会导致一些神奇的错误,并且很难调试:

如果有一个零宽度的空间""


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.