【问题标题】:C# Switch with String.IsNullOrEmptyC# 使用 String.IsNullOrEmpty 切换
【发布时间】:2010-09-30 17:40:29
【问题描述】:

是否可以在 C# 中使用一个开关来检查值是否为空或空,而不是“”,而是 String.Empty?我知道我可以做到:

switch (text)
{
    case null:
    case "":
        break;
}

有没有更好的方法,因为我不想拥有大量的 IF 语句?

我正在尝试替换:

if (String.IsNullOrEmpty(text))
    blah;
else if (text = "hi")
    blah

【问题讨论】:

  • 我不知道 String.Empty 和 "" 之间有区别。有什么区别?
  • 没有。在内容层面也是如此。参考不同。 String.Empty 总是返回相同的实例,而 "" 返回不同的实例。
  • 我很确定两个 "" 实际上是同一个对象,因为 .net 实习生字符串,但不是肯定的。 object.ReferenceEquals 表示它们是相同的。
  • 我的测试与 Josh 的一致 - 文字空字符串 "" 指的是与 String.Empty 相同的对象。我不确定任何标准都可以保证这一点(尽管可以保证文字的实习 - 不确定该保证是否适用于 String.Empty),但现在肯定会发生这种情况。
  • 现在的问题是......如果它在单独的程序集中或在单独的方法/类/等中怎么办?亲身。我使用 String.Empty 因为它比 "" 更具可读性。

标签: c# string switch-statement semantics


【解决方案1】:

怎么样

if (string.isNullOrEmpty(text))
{
   //blah
}
else
{
 switch (text)
 {
     case "hi":
 }

}

【讨论】:

  • 问题是要避免 if-else 语句。
  • 如果您查看编辑历史记录,原始问题并未包含有关 if else 的任何内容;-)
  • 这也避免了他担心的 if 子句的样式,因为只有一个 if else 而不是 if elseif elseif 等。
【解决方案2】:

我建议如下:

switch(text ?? String.Empty)
{
    case "":
        break;
    case "hi":
        break;
}

这就是你要找的吗?

【讨论】:

    【解决方案3】:

    来自String.Emptydocumentation

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

    我将此解释为""String.Empty 之间没有区别。你为什么要区分它们?

    【讨论】:

    • 我不确定 "" 和 String.Empty 在文化(unicode ascii 等)方面是否存在差异。
    【解决方案4】:

    您的示例 switch 语句有什么问题?

    switch (text)
    {
        case null:
        case "":
            foo();
            break;
        case "hi":
            bar();
            break;
    }
    

    它有效(出于某种让我感到惊讶的原因 - 我认为它会在 null 案例中抱怨或崩溃)并且很明显。

    那么,你为什么担心String.Empty?我在这里遗漏了一些东西。

    【讨论】:

      【解决方案5】:

      一个空字符串是"",它等于String.Empty。 可以在 case 语句中放入“”而不是“String.Empty”的原因是“Empty”是“String”类的一个字段,而“”实际上是一个常量值。

      在某些情况下允许使用常量值,String.Empty 是一个字段,可以在运行时更改。 (在这种情况下,它将保持不变,但并非每个类的所有静态字段都是常量值。)

      在“if”的情况下,该条件在运行时进行评估,如果 not 需要一个常量值。

      我希望这能解释原因。

      【讨论】:

        【解决方案6】:

        我刚刚注意到的一点是,您可以组合 if/else 和 switch 语句!在需要检查前置条件时非常有用。

        if (string.IsNullOrEmpty(text))
        {
            //blah
        }
        else switch (text)
        {
            case "hi":
                Console.WriteLine("How about a nice game of chess?");
                break;
            default:
                break;
        }
        

        【讨论】:

        • 有人在 SO 上的相关帖子中指出,这并没有真正组合语句,但 else 子句只是没有花括号,因此 switch 是唯一执行的语句。这在语法上与 Josh 的回答相同。不过我觉得挺好看的。
        【解决方案7】:
        string StrMode;
        if (!string.IsNullOrEmpty(StrMode))
        {  
            switch (StrMode.Trim())
            {
                case "Souse":
                {
                     //Statement Eg:  
                     MesssageBox.Show("Souse");
                     break;
                }
        
                case "Company Agent":
                {
                     //Statement Eg:
                     MesssageBox.Show("Souse");
                     break; 
                }
        
                default:
                     return;
            }
        }
        

        【讨论】:

          【解决方案8】:

          有了新的c#特性,你可以使用switch expression语法

                 text switch
                 {
                     "" or null => "a",
                     _ => "b"
                 };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-26
            • 1970-01-01
            相关资源
            最近更新 更多