为什么string.Empty比.Net中的“”效率更高

Why is string.Empty more efficient than “” in .Net

我确信string.empty比在.NET语言中使用"更有效"。我想知道的是为什么它更有效?


我认为在大多数情况下没有区别。在正常情况下,当您在代码中使用""时,这个字符串将被实习生,同一个字符串实例将被重用。因此在使用""时,与String.Empty相比,不会有更多的字符串实例。

如果你想要证据:

1
2
3
4
5
6
7
Dim a As String
Dim b As String

a =""
b =""

Console.WriteLine(Object.ReferenceEquals(a, b)) ' Prints True '

如果用String.Empty替换其中的一个,上面的代码也会打印True,因此您甚至可以在不创建额外的字符串实例的情况下混合这些方法。

底线:区别在于个人品味。


首先,我不确定它是否更有效率。它是静态的一个原因是,它基本上是一个常量:只有一个空字符串。

一个更重要的问题是,.NET中的字符串内部存在一些不一致的地方,这可能导致与string.empty的比较,而不总是返回预期的结果,这取决于您使用的运行时的版本。埃里克·利珀特在这里写了一篇引人入胜的博客文章。

(摘自埃里克的文章)

1
2
3
4
5
6
object obj ="";
string str1 ="";
string str2 = String.Empty;
Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true
Console.WriteLine(obj == str2); // sometimes true, sometimes false?!


""将在应用程序中创建空字符串的实例。当然,.NET会插入字符串常量,但仍然会创建一个实例。另一方面,String.Empty不创建任何实例。


我认为在使用string.empty over"时没有任何性能提升。

这只是个人喜好的问题。


在2.0之前,String.Empty的效率更高是正确的,但从来没有区别。看看string.empty和"(empty string)有什么区别?


如果您想阅读一些基于汇编程序的证据,下面的文章可能会很有趣:在C中,我应该使用string.empty还是string.empty或"初始化字符串"?

实际上,整个过程中有一些有趣的答案。


空字符串是一个已经构造的单例静态常量字符串,但"将创建一个空字符串"。