我正在审查一些代码,我发现了一些看起来像这样的东西:
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)
也会写一些东西,只是为了确保在我必须修改代码时我不会误读它.
事实上,对于诸如等的基本类型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)
这种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)
似乎是明显的赢家.
归档时间: |
|
查看次数: |
27688 次 |
最近记录: |