我想尝试以下代码:
//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; }
}
}
这是最好的方式吗?
答案 0 :(得分:7)
&&
是一个短路操作符,所以你编写它的第一种方式和第二种方式在功能上是等效的。
if (a && b && c)
{
// work
}
仅当b
返回true时,才会评估 a
。 (同样适用于c
)。
在您的代码中,检查m.terms[0].labels
不会有问题,因为如果m.terms[0]
为null,您将会从表达式中短路。
要完全覆盖自己,您可能希望添加m
和m.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但是正在尝试访问。