【问题标题】:What is the difference between String.Empty and “” and null? [duplicate]String.Empty 和 "" 和 null 有什么区别? [复制]
【发布时间】:2009-06-22 16:27:39
【问题描述】:

可能重复:
What is the difference between String.Empty and “”

"" 是否等同于 String.Empty

初始化字符串值首选哪个?

【问题讨论】:

标签: c# .net


【解决方案1】:
public sealed class String {
    //...
    public static readonly String Empty = "";
    //...
}

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

当你想表示有一个值,但该值是一个空字符串时,使用String.Empty

【讨论】:

  • 非常重要的是,它也是只读的 :)
  • 我想说,由于缺少 String.Unknown,null 也可以用来表示未知值(以及没有值)。
  • null 是指does not exist 还是exists but is unknown 取决于您在程序中使用它的方式,开发人员应该使代码清晰或记录下来。但肯定绝对不应该有 String.Unknown,因为它不属于 String 类。
【解决方案2】:

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

(感谢指正)

【讨论】:

  • 从技术上讲,String.Empty 不是一个常数。这是一个静态只读字段。如果是常量,"" 和 string.Empty 没有区别。
  • String.Empty 不是一个常量,它是一个字段。它的支持值是一个常量,但是 String.Empty 不是一个常量会带来一些限制。例如,您不能将其用作 switch 语句的 case 子句中的值。
  • 请注意,“”可能创建一个额外的字符串once。并不是每次遍历代码时都会创建一个新字符串。
【解决方案3】:

是的。还有String.Empty,不过请don't worry about it

String.Empty 和“”之间的区别很小,但是有一个 不同之处。 “”实际上创建了一个 对象,它很可能会从字符串实习生池中拉出,而 String.Empty 不会创建对象,所以如果你真的在寻找终极 内存效率,我建议 String.Empty。 但是,您应该记住,差异是如此微不足道,您将 就像从未在您的代码中看到它一样......

【讨论】:

  • 是的,我的想法是,如果你那么担心内存,你不应该使用 .Net:P
【解决方案4】:

使用你认为最易读的那个。

我挑战任何人,让他们找到一个现实应用程序,其中存在显着的性能差异......它不会发生。但是,不同的人会发现不同的方法更具可读性。

就个人而言,我是"" 的人。我发现它不那么杂乱,而且我从来没有遇到过我实际上意外使用" "(或类似的东西)的问题。 (这是经常提出的反对意见之一。)

如果你更喜欢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:我怀疑在 一些 案例中不会这样,但它们会是涉及 CompilerRelaxations.NoStringInterning 之类的复杂案例。我强烈怀疑它通常不会创建 any 字符串,但“最多一个”在性能方面已经足够好,并且在奇怪的极端情况下不太可能出错:)
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

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

    【讨论】:

      【解决方案7】:

      他们是平等的。但是 String.Empty 是常量。

      "" - 是创建 String 的方式。

      【讨论】:

      • String.Empty 至少在 C# 术语中不是常量。这是一个公共静态只读字段。
      • 其实 "" 是一个字面常量,而 String.Empty 根本不是常量,所以你把它倒过来了。
      【解决方案8】:

      你要找的答案就在这里。

      What is the difference between String.Empty and "" (empty string)?

      使用 String.Empty

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 2016-12-23
        • 2015-07-19
        • 2018-03-19
        • 1970-01-01
        • 2017-11-16
        • 2010-09-14
        • 2013-10-19
        • 2021-10-29
        相关资源
        最近更新 更多