更多关于if语句的简短代码

时间:2011-07-28 15:02:55

标签: c# if-statement

我想尝试以下代码:

//all arrays are List<T> type.
if (m.terms[0] != null && m.terms[0].labels != null && m.terms[0].labels[0].title == "Part-of-speech")
{
    result = true; 
}

但在以下情况下偶尔会发生运行时错误

  

i。 m.terms == null

     

ii。 m.terms!= null,但m.terms [0]未初始化。

     

iii。 m.terms!= null,并且m.terms [0]已存在,但   m.terms [0] .label没有初始化。

...

所以我把它修改成这样:

if (m.terms[0] != null)
{
    if (m.terms[0].labels != null)
    {
        if (m.terms[0].labels[0].title == "Part-of-speech") { result = true; }
    }
}

这是最好的方式吗?

5 个答案:

答案 0 :(得分:7)

&&是一个短路操作符,所以你编写它的第一种方式和第二种方式在功能上是等效的。

if (a && b && c)
{
    // work 
}
仅当b返回true时,才会评估

a。 (同样适用于c)。

在您的代码中,检查m.terms[0].labels不会有问题,因为如果m.terms[0]为null,您将会从表达式中短路。

要完全覆盖自己,您可能希望添加mm.terms的支票。

m != null && m.terms != null && m.terms.Count > 0 && m.terms[0] != null ...

当它从左到右进行评估时,它将在第一个未通过的条件下中断,其余条件将不受控制。

答案 1 :(得分:3)

int index = 0;
int labelIndex = 0;
string titleToCheck = "Part-of-speech";

if (m != null && m.terms != null && m.terms.Count > index)// or m.Length...
{
    if (m.terms[index] != null && m.terms[index].labels != null &&
        m.terms[index].labels.Count > labelIndex)
    {
        if (m.terms[index].labels[labelIndex].title == titleToCheck)
        {
            result = true; 
        }
    }
}

答案 2 :(得分:1)

这完全取决于可读性。 C#使用Short-circuit evaluation因此在功能上没有区别。

答案 3 :(得分:0)

试试这个

if (m!=null && m.terms!= null && m.terms[0].labels!=null && m.terms[0].labels[0].title!=null && m.terms[0].labels[0].title == "Part-of-speech")

答案 4 :(得分:-2)

是的,最好将每个空检查分成单独的if语句。

原因是第二个和第三个条件要求第一个不为空。如果第一个为null,则第二个和第三个条件将依次抛出错误,因为它们的父级为null但是正在尝试访问。