c# – 如何在If语句中正确进行等效性测试?
在C#If语句中,我通常会进行如下的等效性测试:
if (isPrime == true) 但是我的朋友说那是错的,或者浪费了资源.他说这是正确的做法: if (isPrime) 他试图解释,但我不明白为什么条件检查中缺少条件! 我知道我是一个菜鸟,但对我而言,看起来这些方括号中只有左侧的等式.我的朋友是对的吗?为什么? 解决方法
两者都很好.实际上,它们生成完全相同的IL:
bool isPrime = true; if (isPrime == true); 和 bool isPrime = true; if (isPrime); 生成 IL_0000: nop IL_0001: ldc.i4.1 IL_0002: stloc.0 // isPrime IL_0003: ldloc.0 // isPrime IL_0004: ldc.i4.0 IL_0005: ceq IL_0007: stloc.1 IL_0008: ldloc.1 IL_0009: brtrue.s IL_000B IL_000B: ret 如果你的if语句只有一个左侧语句(没有等号),编译器将尝试隐式地将你的左侧类型转换为bool,然后调用左侧的比较运算符并为true.如果你写了isPrime == true就会发生这种情况,所以实际上没有浪费资源,你运行的代码完全相同. 然而,有一个问题.您没有指定isPrime的类型.如果它是一个可空的bool,就像在布尔一样? isPrime,然后 bool? isPrime = true; if (isPrime); 不会编译.在这种情况下,编译器必须这样做 if (isPrime == true); 这有点浪费,因为它涉及对Nullable< T> .GetValueOrDefault()的可能不必要的调用.如果你有布尔?并且你知道它有价值(也许你之前已经验证过),那么你可以使用: if (isPrime.Value); 这不需要该调用,并将节省一些资源(尽管编译器优化).您可能不需要这种性能提升,因此请考虑可读性. 如果你很好奇,我在这里用LINQPad来生成ILs,我也检查了the official implementation available for (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |