String.Empty和""(空字符串)有什么区别?
在.NET中," String.Empty"和"""之间有什么区别,并且它们是可互换的,还是围绕String.Empty确保的基本引用或者本地化问题不成问题?
解决方案
在2.0版之前的.NET中,"''"会创建一个对象,而" string.Empty"不会创建objectref,这会使" string.Empty"更高效。
在2.0版及更高版本的.NET中,所有出现的"""都指向相同的字符串文字,这意味着"""等效于" .Empty",但仍不如" .Length == 0"快。
.Length == 0
是最快的选项,但是.Empty
使代码更简洁。
有关更多信息,请参见.NET规范。
String.Empty不会创建对象,而""会创建对象。但是,这里指出的区别是微不足道的。
没关系!
过去对此的一些讨论:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
""的所有实例都是相同的,被插入的字符串文字(或者应该是)。因此,我们实际上不会每次使用""时都在堆上抛出新对象,而只是创建对相同的被实习对象的引用。话虽如此,我更喜欢string.Empty。我认为这使代码更具可读性。
先前的答案对于.NET 1.1是正确的(请查看它们链接的发布日期:2003年)。从.NET 2.0及更高版本开始,基本上没有区别。无论如何,JIT最终将引用堆上的同一对象。
根据规范第2.4.4.5节:
http://msdn.microsoft.com/zh-CN/library/aa691090(VS.71).aspx
Each string literal does not necessarily result in a new string instance. When two or more string literals that are equivalent according to the string equality operator (Section 7.9.7) appear in the same assembly, these string literals refer to the same string instance.
有人甚至在布拉德·艾布拉姆(Brad Abram)的评论中提到了这一点
总之,""与String.Empty的实际结果为零。 JIT最终会解决这个问题。
我个人发现,JIT比我聪明得多,因此我尽量不要对此类微编译器优化变得太聪明。与I或者Ccompiler之前无法预料的相比,JIT将在更合适的时间展开for()循环,更好地删除冗余代码,内联方法等。让JIT做好它的工作:)
上面的答案在技术上是正确的,但是为了获得最佳的代码可读性和最小的机会,我们可能真正想使用的是String.IsNullOrEmpty(s)
String.Empty
是一个只读字段,而""
是一个常量。这意味着我们不能在switch语句中使用String.Empty
,因为它不是常量。