【问题标题】:how to switch on a nullable variable如何打开可为空的变量
【发布时间】:2010-12-16 16:18:38
【问题描述】:

我有以下代码

 switch (xn.SelectSingleNode("@type").InnerText)
            {
                case "int":
                case "int16":
                case "int32":v=int.Parse(xn.InnerText);break;
                default:v=xn.InnerText; break;

            }

xn.SelectSingleNode("@type") 可能返回 null, 如何声明 switch(x) 可以为空

【问题讨论】:

  • 返回的null 值应由您在switch 指令中的default 行为处理。这不是你想要的吗?
  • @Will,null 将是 SelectSingleNode 的结果,在这种情况下,调用 InnerText 将是一个 NRE。
  • @Anthony:同意。我没有从那个角度看 OP 的问题。

标签: .net c#-4.0


【解决方案1】:
var type = xn.SelectSingleNode("@type");
if (type == null)
{
    // Handle the case
}
else
{
    switch (type.InnerText)
    {
        case "int":
        case "int16":
        case "int32":v=int.Parse(xn.InnerText);break;
        default:v=xn.InnerText; break;
    }
}

【讨论】:

  • +1 以我谦虚的观点,验证空引用始终是一个好习惯。 =)
【解决方案2】:

作为对象的字符串总是可以为空的。只需在您的 switch 语句中包含 null 作为一种可能性:

switch (xn.SelectSingleNode("@type").InnerText)
{
    case "int":
    case "int16":
    case "int32":v=int.Parse(xn.InnerText);break;
    case null:
        // Handle case
        break;
    default:v=xn.InnerText; break;

}

【讨论】:

  • +1 你明白了,精简而迅速,为程序员保持简单性和可读性。有什么比处理null! 更简单的了?我喜欢!
【解决方案3】:

我会选择这个(为了可读性而扩展)

var node = xn.SelectSingleNode("@type");
var innerText = (node == null ? (string)null : node.InnerText);
switch (innertext)
...

【讨论】:

    【解决方案4】:
    switch (xn.SelectSingleNode("@type").InnerText) {
        case "int":
        case "int16":
        case "int32":
            v = int.Parse(xn.InnerText);
            break;
        default: 
            v = string.IsNullOrEmpty(xn.InnerText) ? null : xn.InnerText; // Here you shall avoid the `NullReferenceException`.
            break;
    }
    

    另外,如果我理解正确的话,v 看起来像是 int,所以当xn.InnerText 返回 null 时,您可能希望考虑将其分配给 0

    v = string.IsNullOrEmpty(xn.InnerText) ? 0 : xn.InnerText;
    

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 2023-01-17
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多