Why is string.Empty more efficient than “” in .Net
我确信string.empty比在.NET语言中使用"更有效"。我想知道的是为什么它更有效?
- 什么让你觉得它更有效率?
- @Gregory-Stylecop建议将"改为string.empty"。我喜欢认为这背后有某种原因…
- 但是,是什么让你认为推理与效率有关呢?
- 是什么让您认为StyleCop总是正确的,并且总是在其建议中保持最新?
我认为在大多数情况下没有区别。在正常情况下,当您在代码中使用""时,这个字符串将被实习生,同一个字符串实例将被重用。因此在使用""时,与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,因此您甚至可以在不创建额外的字符串实例的情况下混合这些方法。
底线:区别在于个人品味。
- 与访问puplic静态字符串相比,访问内部字符串是否有开销?
- 好的,接受回答。这很好知道,因为很多IT怪人不喜欢使用"。我想这也是另一个值得忽略的样式警察规则。
- @乔诺:从来没有量过,但如果有什么不同,我会很惊讶的。
首先,我不确定它是否更有效率。它是静态的一个原因是,它基本上是一个常量:只有一个空字符串。
一个更重要的问题是,.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?! |
- 第三行永远不会错。也许你是说object.referenceequals?
""将在应用程序中创建空字符串的实例。当然,.NET会插入字符串常量,但仍然会创建一个实例。另一方面,String.Empty不创建任何实例。
我认为在使用string.empty over"时没有任何性能提升。
这只是个人喜好的问题。
- 同意,但string.Empty肯定比
- Stylecop建议使用String.Empty,这肯定不仅仅是因为它的视觉效果比?
- 塞巴斯蒂安-不正确。如果"在代码中,那么对"的所有引用都将被实习生到同一个实例中,就像任何其他字符串常量一样。
- 同意这是错误的
- 库普是对的,塞巴斯蒂安是错的。
在2.0之前,String.Empty的效率更高是正确的,但从来没有区别。看看string.empty和"(empty string)有什么区别?
如果您想阅读一些基于汇编程序的证据,下面的文章可能会很有趣:在C中,我应该使用string.empty还是string.empty或"初始化字符串"?
实际上,整个过程中有一些有趣的答案。
空字符串是一个已经构造的单例静态常量字符串,但"将创建一个空字符串"。
- …这也意味着它被拘留了-内存中只有一个字符串副本,不管使用了多少次。
- 因此,如果您使用的是大量的字符串操作,那么它的效率会更高!
- 它不会每次引用时都创建一个新实例,"它将使用对单个interned值的引用"
- 错了,找绳子绑住。但是,如果您使用:new string(""),您将使用更多的内存…
- 所以编译器是智能的。
- 如果使用new string(""),则会出现编译时错误-没有只使用字符串的字符串构造函数。