C# 使用 String.IsNullOrEmpty 切换

Posted

技术标签:

【中文标题】C# 使用 String.IsNullOrEmpty 切换【英文标题】:C# Switch with 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 因为它比 "" 更具可读性。 【参考方案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.Empty的documentation:

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

我将此解释为""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"
       ;

【讨论】:

以上是关于C# 使用 String.IsNullOrEmpty 切换的主要内容,如果未能解决你的问题,请参考以下文章

创建可以从 c# 和 c++ 中使用的 c# dll

如何使用 C# GUI 调用 C# 控制台应用程序 [重复]

使用 C# 从 RLM 读取许可证文件(C++ 到 C# 的翻译)

如何在 C# 的泛型中使用扩展

使用托管 C++ 项目中的 C# 类

c#脚本中使用c#方法