代码之家  ›  专栏  ›  技术社区  ›  Mikeyg36

不能将string.empty用作可选参数的默认值

  •  83
  • Mikeyg36  · 技术社区  · 16 年前

    我在读书 有效C 比尔·瓦格纳。在 第14项-最小化重复初始化逻辑 他展示了在构造函数中使用新的可选参数特性的以下示例:

    public MyClass(int initialCount = 0, string name = "")

    注意他用过 "" 而不是 string.Empty .
    他评论说:

    您将注意到[在上面的示例中]第二个构造函数为 名称 参数,而不是更习惯的 空字符串 . 那是因为 空字符串 不是编译时常量。它是在字符串类中定义的静态属性。因为它不是编译常量,所以不能将它用作参数的默认值。

    如果我们不能使用 空字符串 在所有情况下都是静态的,那么这是否会破坏它的目的呢?我想我们应该使用它来确保我们有一个独立于系统的方法来引用空字符串。我的理解错了吗?谢谢。

    更新
    只是后续评论。根据msdn:

    每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送参数,则使用默认值。 默认值必须是常量。

    那我们就不能用了 System.Environment.NewLine 或者使用新实例化的对象作为默认值。我还没用过VS2010,这真让人失望!

    8 回复  |  直到 11 年前
        1
  •  58
  •   Andy Mortimer    16 年前

    对于C 2.0编译器,几乎没有什么意义 String.Empty 不管怎样,事实上在很多情况下,它是悲观的,因为编译器可以内联对 "" 但不能用同样的方法 空字符串 .

    在C 1.1中,避免创建大量独立的对象(所有这些对象都包含空字符串)是很有用的,但是那些日子已经过去了。 工作很好。

        2
  •  52
  •   Matthew Strawbridge    14 年前

    如果您真的想将空字符串用作可选参数值,那么没有什么可以阻止您为其定义自己的常量:

    const string String_Empty = "";
    
    public static void PrintString(string s = String_Empty)
    {
        Console.WriteLine(s);
    }
    

    [作为旁白,有一个理由更喜欢 String.Empty 结束 "" 一般来说,其他答案中没有提到这一点,那就是存在各种各样的Unicode字符(零宽度连接符等),这些字符对肉眼来说实际上是不可见的。所以看起来像 不一定是空字符串,而 空字符串 你很清楚自己在用什么。我认识到这不是常见的bug源,但这是可能的。]

        3
  •  23
  •   Jon Skeet    14 年前

    从原始问题:

    我想我们应该使用它来确保我们有一个独立于系统的方法来引用空字符串。

    空字符串在不同系统中有什么不同?它总是一个没有字符的字符串!我会 真的? 如果我发现一个实现 string.Empty == "" 返回错误:)这是 和…一样 Environment.NewLine .

    从反恐组织的赏金岗位:

    我想要字符串。空可以在下一个C版本中用作默认参数。D

    那当然不会发生。

    虽然我个人也希望使用一种完全不同的默认机制,但自启动以来可选参数在.NET中的工作方式始终意味着在元数据中嵌入常量,以便调用代码可以在没有提供相应参数的情况下将该常量复制到调用站点。

    string.Empty 它的 真的? 无意义-使用 "" 会做你想做的;是吗 那个 使用字符串文字很痛苦?(我在任何地方都使用文字-我从不使用 空字符串 -但这是另一种说法。)

    这就是我对这个问题感到惊讶的地方——抱怨围绕着 实际上会造成一个真正的问题。在您希望在执行时计算默认值的情况下,这一点更为重要,因为它实际上可能会有所不同。例如,我可以想象这样的情况,您希望能够使用 DateTime 参数,默认为“当前时间”。目前,我所知道的唯一一个模糊优雅的工作环境是:

    public void RecordTime(string message, DateTime? dateTime = null)
    {
        var realDateTime = dateTime ?? DateTime.UtcNow;
    }
    

    …但这并不总是合适的。

    总之:

    • 我非常怀疑这是否会成为C的一部分。#
    • 为了 空字符串 不管怎样,这是毫无意义的
    • 其他价值观 不要 总是有相同的价值,真的 可以 是一种痛苦
        4
  •  7
  •   Hans Olsson    16 年前

    我从不用绳子。空的,我看不出它的意义。也许它可以让那些刚开始编程的人更容易,但我怀疑它是否有用。

        5
  •  4
  •   Tom Cabanski    16 年前

    我认为字符串背后的想法。空的是它增强了可读性。它不像newline那样,在不同的平台上表示它的方式有任何区别。它是asname,不能在默认参数中使用。但是,如果您在Windows和Linux上的Mono之类的设备之间进行端口连接,则不会导致任何问题。

        6
  •  3
  •   Shawn Eavis    14 年前

    作为Fyi,似乎对传递给属性构造函数的值施加了相同的约束——它们必须是常量。因为string.empty被定义为:

    public static readonly string Empty
    

    它不能被使用,而不是实际的常量。

        7
  •  1
  •   lukejkw    11 年前

    我用 string.Empty 纯粹是为了可读性。

    如果以后有人需要读取/更改我的代码,他们就会知道我是想检查或设置一个空字符串。只使用 "" 有时会导致错误和混乱,因为我可能只是忘记了把我想要的字符串放在那里。

    例如:

    if(someString == string.Empty)
    {
    
    }
    

    VS

    if(someString == "")
    {
    
    }
    

    第一 if 这句话对我来说似乎更仔细,更易读。因为这只是一种偏好,我真的不认为火车会在使用中崩溃。 而不是 空字符串 .

        8
  •  -2
  •   lokum09    12 年前

    也许这个问题的最佳解决方案是通过这种方式重载这个方法:

    public static void PrintString() 
    { 
        PrintString(string.Empty);
    }