String.Empty与""有什么区别?

144

如果你在反编译器中打开它,你会发现它们是相同的。 - JoeGeeky
可能是重复问题:https://dev59.com/XXVC5IYBdhLWcg3w51hv#151481 - Brian R. Bondy
流行的相关问题 https://dev59.com/NXVC5IYBdhLWcg3wihqv - Michael Freidgeim
5个回答

117

并没有什么不同。

http://msdn.microsoft.com/en-us/library/system.string.empty.aspx:

该字段的值是零长度的字符串,即 ""。

在应用程序代码中,此字段最常用于将字符串变量初始化为空字符串。要测试一个字符串的值是否为 nullString.Empty,请使用 IsNullOrEmpty 方法。


1
正如重复所说,它在 .NET 2 及以上版本中并没有不同。 - JoeBilly
23
在.NET 1时代,情况是不同的。因此,您会在仍在使用的旧代码中看到String.Empty,并被那些经历过.NET 1时代的老派人士反射性地输入。请友善一点,这留下了深刻的印记。 - tekHedd
引用错误。IsNullOrEmpty显然(如其名称所示)不能用于测试字符串的值是否为string.Empty - Mo B.

116

根据Brad Abrams的说法:

正如David所暗示的那样,“String.Empty”和“”之间的差异非常小,但确实存在差异。 “”实际上创建了一个对象,它可能会被提取出字符串内部池,但仍然会创建一个对象...而“String.Empty”不会创建任何对象...因此,如果您真的在寻求最终的内存效率,我建议使用“String.Empty”。但是,请记住,这种差异微不足道,在您的代码中几乎不会看到它。

至于System.String.Empty或string.Empty或String.Empty…我的关注程度很低;-)

更新(6/3/2015):

评论中提到上述2003年的引用已经过时(我假设这是指“”实际上创建了一个对象的声明)。因此,我刚刚在C#5(VS 2013)中创建了一些简单的控制台程序:

class Program
{
    static void Main()
    {
        // Outputs "True"
        Debug.WriteLine(string.IsInterned(string.Empty) != null);
    }
}

class Program
{
    static void Main()
    {
        // Outputs "True"
        Debug.WriteLine(string.IsInterned("") != null);
    }
}

这表明当您的代码开始运行时,""String.Empty都被缓存,实际上它们是相同的。

Brad评论中最重要的部分是:

你应该牢记这个微不足道的区别几乎看不见它存在于你的代码中...

这就是核心问题。在选择使用""和String.Empty之间并非基于性能而作出决策。不要浪费太多时间考虑它。根据您发现哪个更易读,或者您项目中已经使用的约定来做出选择。


4
输入两个引号比输入String.Empty要快得多,而且两个引号也可以跨平台使用。这是一个不需要思考的选择。 - Brain2000
9
相比于 string.Empty,我个人发现 "" 更易于阅读和理解。 - David R Tribble
8
在快速原型编写代码时,我经常在各个地方乱用"",这后来导致了许多错误,因为我的意图不清楚:“我是有意要在这里传递空字符串”,还是“我忘记在这里传递非空字符串了”。 - George Chakhidze
1
@GeorgeChakhidze,你不需要使用string.Empty,因为在原型设计时,你也可以引入一个单字母常量来表示空字符串。 - symbiont

15

没有区别。一些人喜欢使用String.Empty以便提高代码的可读性。使用你自己习惯的即可。


7
依我之见,String.Empty 并不比 "" 更易读。我不喜欢它。我总是使用 ""。我们用双引号表示非空字符串字面量,所以为了保持一致,我们应该对字符串字面量也使用双引号。 - Polyfun

11

大多数情况下,String.Empty"" 是相同的。不过通常我发现使用 String.IsNullOrEmpty(str) 要比比较 str == "" || str == null 更方便。此外,如果你使用的是 .NET 4.0,String.IsNullOrWhiteSpace(str) 可以覆盖更多的情况,而且是最好的选择。


68
你误解了重点:String.IsNullOrEmpty(str)string.Empty没有任何关系,除了两者都含有单词"empty"之外。请注意,这不是解释。 - Heinz Kessler
2
在我看来,str == "" || str == null 看起来相当低效,因为左边先被评估。这是使用 IsNullOrEmpty 方法的另一个原因 :-) - TToni

3

string.Empty始终是相同的对象。

""始终是一个新对象,可能需要由垃圾回收器删除。

因此,您应该始终使用string.empty而不是""。

string a="";
string b=string.Empty;

被翻译为

IL_0000:  ldstr       ""
IL_0005:  ldsfld      System.String.Empty

12
每次并不会创建一个新的对象。http://zh.wikipedia.org/wiki/字符串池 - Josh Stodola
2
编译器将把它们全部“链接”到一个空字符串。 - cyberzed
2
我在某个地方读到过(抱歉,我不记得是哪里了),空字符串在每个程序集中都会被复制一次。因此,每个使用 "" 而不是 System.String.Empty 的程序集都浪费了宝贵的内存!;-) - mcrumley
12
您的意思是,“不使用 String.Empty 的主要原因是可读性”吗? - BlackTigerX
重新翻出一個舊帖子只是為了好玩:這個答案曾經是正確的,但現在已經不再是了。安息吧 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接