在一行中嵌套if语句?

时间:2014-06-10 14:27:19

标签: c# asp.net if-statement

现在我有以下一行:

<div class="<%#  productName.Url.Length > 3 ? "Classic": "" %>">..</div>

但问题是productName可能为null所以我收到以下错误:Object reference not set to an instance of an object

所以我需要确保只有在productName不为null时执行if语句。

像这样:

    if (productName.Url != null)
    {
        if (productName.Url.Length > 3)
        {
            "Classic"
        }
        else
        {
            ""
        }
    }

使用一条线的唯一解决方案是什么?或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:4)

您可以使用三元运算符?:

productName.Url != null && productName.Url.Length > 3 ? "Classic" : ""

答案 1 :(得分:3)

正如其他人所说的那样,所有单行限制都会妨碍可读性,但您可以使用短路布尔评估来为现有的条件表达式添加保护,如下所示:

productName != null && productName.Url != null && productName.Url.Length > 3 
     ? "Classic": ""

FWIW的可读性我通常将条件三元运算符格式化为:

var foo = prodName != null && prodName.Url != null && prodName.Url.Length > 3
  ? "Classic"
  : "";

此外,由于C#6包含null-conditional operator,您可以将其略微减少为:

var foo = productName?.Url != null && productName.Url.Length > 3 
   ? "Classic" 
   : "";

修改,重新评论

条件运算符也可以嵌套(但现在你确实需要缩进以保持理智):

var foo = prodName?.Url != null 
     ? prodName.Url.Length > 3
          ? "Classic"
          : ""
     : "Default Value if Prod / Prod Url is null";

嵌套三元与基于交换的模式匹配

另外,请注意,随着C#8的推出,我们将能够用更高级switch based pattern matching

的预测替换三元运营商

答案 2 :(得分:2)

<div class="<%# (productName != null && productName.Url != null && productName.Url.Length > 3) ? "Classic": "" %>">..</div>