如何在If语句中正确进行等效性测试?

时间:2016-03-04 04:58:05

标签: c#

在C#If语句中,我通常会进行这样的等价测试:

if (isPrime == true)

但是我的朋友说错了或浪费了资源。他说这是正确的做法:

if (isPrime)

他试图解释,但我不明白为什么条件检查中缺少这个条件!

我知道我是一个菜鸟,但对我来说,看起来这些方括号中只有左边的等式。我的朋友是对的吗?为什么呢?

7 个答案:

答案 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时解析为truefalse,因此您无需将其与任何内容进行比较。

例如:

if (isPrime == true)

if (isPrime)

都是等效的,如果isPrime的值确实为真,则会通过。

反过来也是可能的:

if (isPrime == false)

if (!isPrime)
由于同样的原因,

也是等同的。

至于是否使用其中一种,它完全是个人或编码风格的选择。有些人更喜欢明确定义if语句,有些人(包括我自己)更喜欢保持简单但只是自己测试变量。编译器并不关心,无论如何都会减少相同的操作。

请注意if statement的MSDN文章使用此作为主要示例。

答案 3 :(得分:1)

条件不缺。检查isPrime是否属实。同样如果你给if(!isPrime)它会检查错误。

答案 4 :(得分:1)

@Tdorno的评论不会浪费任何资源。

如果isPrimeboolean则必须为真或假。当你在一个条件下给它时,它只返回变量的值。如果我们有int变量,它只返回数值,因此它不正确。

例如。你可以用

if(true){
 //Statements
}

明智的isPrime会返回truefalse

if(isPrime){
 //Statement
}

答案 5 :(得分:1)

您可以使用

if (isPrime == true) 

if (isPrime)

两者具有相同的含义,它们之间没有性能差异。但是对最佳编码实践的建议是使用if(isPrime),因为代码很小。

答案 6 :(得分:1)

我认为第二个例子更好,但它不会对编译器产生任何影响。编程语言适用于人类,因此最受观众欢迎的是。

第一个例子基本上夸大了案例是真实的恕我直言,而第二个更简洁。

程序员也讨论了否定问题。

if(!isPrime)


if(isPrime != true)


if(isPrime == false)

你更喜欢哪个?我仍然认为第一个是最好的,因为它更简洁。但是,这些都没有正确答案。