使用==或.Equals()进行bool比较

Rya*_*ohn 13 c#

我正在审查一些代码,我发现了一些看起来像这样的东西:

public class MyClass
{
    public bool IsEditable { get; set; }

    public void HandleInput()
    {
        if (IsEditable.Equals(false))
        {
            //do stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,它(IsEditable.Equals(false))是相同的(IsEditable == false)(也是相同的(!IsEditable)).

除了个人喜好,有没有在所有的有什么区别.Equals()==,用于比较特别是当bool小号

Sam*_*ica 10

这主要是一个可读性问题.我通常会使用,==因为这是我以前看到的.

特别是bool,你根本不需要比较它们

if(!IsEditable)
Run Code Online (Sandbox Code Playgroud)

就足够了

虽然,有时我自己if (val == false)也会写一些东西,只是为了确保在我必须修改代码时我不会误读它.


Oli*_*ppi 8

事实上,对于诸如等的基本类型int,bool在调用之间存在差异,Equals()并且==由于CIL具有处理这些类型的指令.调用Equals()强制值的拳击并进行虚拟方法调用,而使用==导致使用单个CIL指令.

!value并且value == false实际上是相同的,至少在与.NET 4.0捆绑在一起的Microsoft的C#编译器中.

因此,在以下方法中进行比较

public static int CompareWithBoxingAndVirtualMethodCall(bool value)
{
    if (value.Equals(false)) { return 0; } else { return 1; }
}

public static int CompareWithCILInstruction(bool value)
{
    if (value == false) { return 0; } else { return 1; }
    if (!value) { return 0; } else { return 1; } // comparison same as line above
}
Run Code Online (Sandbox Code Playgroud)

将编译为以下CIL指令:

// CompareWithBoxingAndVirtualMethodCall

ldarga.s 'value'
ldc.i4.0
call instance bool [mscorlib]System.Boolean::Equals(bool) // virtual method call
brfalse.s IL_000c // additional boolean comparison, jump for if statement

// CompareWithCILInstruction

ldarg.0
brtrue.s IL_0005 // actual single boolean comparison, jump for if statement
Run Code Online (Sandbox Code Playgroud)


das*_*ght 7

这种Equals方式似乎要慢得多 - 在调试模式下大约为2.7倍,在发布模式下大于7倍.

这是我快速而肮脏的基准:

public static void Main() {
    bool a = bool.Parse("false");
    bool b = bool.Parse("true");
    bool c = bool.Parse("true");
    var sw = new Stopwatch();
    const int Max = 1000000000;
    int count = 0;
    sw.Start();
    // The loop will increment count Max times; let's measure how long it takes
    for (int i = 0; i != Max; i++) {
        count++;
    }
    sw.Stop();
    var baseTime = sw.ElapsedMilliseconds;
    sw.Start();
    count = 0;
    for (int i = 0; i != Max; i++) {
        if (a.Equals(c)) count++;
        if (b.Equals(c)) count++;
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds - baseTime);
    sw.Reset();
    count = 0;
    sw.Start();
    for (int i = 0; i != Max; i++) {
        if (a==c) count++;
        if (b==c) count++;
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds - baseTime);
    sw.Reset();
    count = 0;
    sw.Start();
    for (int i = 0; i != Max; i++) {
        if (!a) count++;
        if (!b) count++;
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds - baseTime);
}
Run Code Online (Sandbox Code Playgroud)

运行此命令会产生以下结果:

在调试模式下

8959
2950
1874
Run Code Online (Sandbox Code Playgroud)

在发布模式下

5348
751
7
Run Code Online (Sandbox Code Playgroud)

Equals似乎是最慢的.==和之间几乎没有什么区别!=.然而,if (!boolExpr)似乎是明显的赢家.

  • 请参阅我的回答(http://stackoverflow.com/a/13615362/128709),了解为什么Equals是最慢的. (4认同)