在C#If语句中,我通常会进行这样的等价测试:
if (isPrime == true)
但是我的朋友说错了或浪费了资源。他说这是正确的做法:
if (isPrime)
他试图解释,但我不明白为什么条件检查中缺少这个条件!
我知道我是一个菜鸟,但对我来说,看起来这些方括号中只有左边的等式。我的朋友是对的吗?为什么呢?
答案 0 :(得分:5)
两者都很好。事实上,它们产生完全相同的IL:
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,如bool? isPrime = true;
if (isPrime);
,那么
if (isPrime == true);
不会编译。在这种情况下,编译器必须执行
Nullable<T>.GetValueOrDefault()
这有点浪费,因为它涉及对bool?
的可能不必要的调用。如果你有一个if (isPrime.Value);
并且你知道它有价值(也许你之前已经验证过了),那么你可以使用:
$(document).ready
哪个不需要该调用,并且会节省一些资源(尽管编译器优化)。有可能你不需要这种性能提升,所以追求可读性。
如果您有点好奇,我使用LINQPad在此处生成了IL,并且我还检查了the official implementation available for struct Nullable<T>
。
答案 1 :(得分:3)
两种方式都是正确的
bool isPrime = true;
if(isPrime)
return;
或者
if(isPrime == true)
return;
如果使用 WPF ,则会出现错误,因为所有wpf控件都是动态(运行时)的依赖对象。即:
if(button1.IsVisibility) // Wrong
return;
if(button.IsVisibility == true) // Correct
return;
我希望它会有所帮助......
答案 2 :(得分:1)
它们都完全一样。由于if
语句只是在您测试bool时解析为true
或false
,因此您无需将其与任何内容进行比较。
例如:
if (isPrime == true)
和
if (isPrime)
都是等效的,如果isPrime
的值确实为真,则会通过。
反过来也是可能的:
if (isPrime == false)
和
if (!isPrime)
由于同样的原因,也是等同的。
至于是否使用其中一种,它完全是个人或编码风格的选择。有些人更喜欢明确定义if语句,有些人(包括我自己)更喜欢保持简单但只是自己测试变量。编译器并不关心,无论如何都会减少相同的操作。
请注意if statement的MSDN文章使用此作为主要示例。
答案 3 :(得分:1)
条件不缺。检查isPrime
是否属实。同样如果你给if(!isPrime)
它会检查错误。
答案 4 :(得分:1)
@Tdorno的评论不会浪费任何资源。
如果isPrime
为boolean
则必须为真或假。当你在一个条件下给它时,它只返回变量的值。如果我们有int
变量,它只返回数值,因此它不正确。
例如。你可以用
if(true){
//Statements
}
明智的isPrime
会返回true
或false
if(isPrime){
//Statement
}
答案 5 :(得分:1)
您可以使用
if (isPrime == true)
或
if (isPrime)
两者具有相同的含义,它们之间没有性能差异。但是对最佳编码实践的建议是使用if(isPrime),因为代码很小。
答案 6 :(得分:1)
我认为第二个例子更好,但它不会对编译器产生任何影响。编程语言适用于人类,因此最受观众欢迎的是。
第一个例子基本上夸大了案例是真实的恕我直言,而第二个更简洁。
程序员也讨论了否定问题。
if(!isPrime)
if(isPrime != true)
if(isPrime == false)
你更喜欢哪个?我仍然认为第一个是最好的,因为它更简洁。但是,这些都没有正确答案。