String.Empty、""和null之间有什么区别?

17

复制。https://dev59.com/XXVC5IYBdhLWcg3w51hv - David Basarab
8个回答

31
public sealed class String {
    //...
    public static readonly String Empty = "";
    //...
}

当你想表示没有值时,请使用null

当你想表示有值,但值为空字符串时,请使用String.Empty


8
相当重要的是,它也是只读的 :) - Jon Skeet
我认为由于缺乏String.Unknown,null也可以用来表示未知值(以及没有值)。 - Michael Meadows
2
无论在程序中如何使用,null 是表示 不存在 还是 存在但未知 都取决于开发人员,并且开发人员应该明确代码或进行文档注释。但是,在 String 类中绝对不应该有 String.Unknown 存在。 - yfeldblum

11

使用String.Empty是因为它是一个静态变量,而不是""需要创建一个新字符串,而null意味着您必须将字符串设置为新的字符串实例。

(感谢更正)


3
从技术上讲,String.Empty不是一个常量。它是一个静态只读字段。如果它是一个常量,""和string.Empty之间就没有区别了。 - Mehrdad Afshari
String.Empty不是一个常量,它是一个字段。它的后备值是一个常量,但是由于String.Empty不是一个常量,你有一些限制。例如,你不能在switch语句的case子句中使用它作为一个值。 - Michael Meadows
2
请注意,"" 可能 会创建一个额外的字符串一次。这并不意味着每次执行代码时都会创建一个新的字符串。 - Jon Skeet

8

是的。还有String.Empty,但请不要担心它

String.Empty和“”之间的差异非常小,但确实存在区别。“”实际上创建了一个对象,它可能会被从字符串池中取出,而String.Empty没有创建任何对象,因此如果您真的在寻求最终的内存效率,建议使用String.Empty。但是,您应该记住,这种差异如此微不足道,以至于您几乎永远不会在代码中看到它...


是的,我的想法是,如果你如此关注内存,你就不应该使用 .Net :P - Spencer Ruport

7

使用您认为最易读的方式。

我向任何人挑战,找到一个在性能方面有显著差异的实际应用程序...这是不可能的。然而,不同的人发现不同的方法更易读。

就我个人而言,我是一个""的人。我觉得它更简洁,而且我从来没有遇到过我意外地使用了" "(或类似的东西)的问题。(这是经常提出的反对意见之一。)

如果您喜欢string.Empty,我当然不会说你是“错误”的。然而,我建议如果你在一个团队中工作,你应该讨论一下,找出大多数人认为更易读的方式,并坚持这种方式。一致性通常是一件好事。

编辑: 只是为了消除一些担忧,可能会因为""会创建一个新的字符串...它可能会创建一个新的字符串一次(可能是每个AppDomain,可能是每个进程; 我不确定,但这真的无关紧要)。每次使用它时都不会创建一个新的字符串。例如,考虑以下代码:

public void Foo()
{
    string x = "";
    for (int i=0; i < 10000000; i++)
    {
        string y = "";
        // Do something here
    }
    string z = "";
}

您可以放心,xyz将引用同一个字符串。最多,调用Foo会创建一个空字符串,只有在第一次调用它时,并且只有在程序中尚未使用空字符串文字的情况下才会创建。上面的代码不会创建1000万个新字符串。

它可能会创建一个新的字符串 - 为什么会这样做?我认为空字符串字面量""已经在内部池中被String.Empty属性引用了。 - Joe
@Joe:我怀疑在某些情况下可能不会,但这些情况涉及到像CompilerRelaxations.NoStringInterning这样的复杂情况。我强烈怀疑它通常不会创建任何字符串,但“最多一个”在性能方面已经足够好了,并且在奇怪的边角情况下更不容易出错 :) - Jon Skeet

5

使用string.Empty被认为是更好的做法,但它们本质上是相等的。它们与null不同。


2

1

它们是相等的。但String.Empty是常量。

"" - 是创建字符串的一种方式。


1
String.Empty在C#术语中并不是一个常量。它是一个公共的静态只读字段。 - Jon Skeet
1
实际上,"" 是一个字面常量,而 String.Empty 根本不是常量,所以你搞反了。 - Michael Meadows

1

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