我为什么不写list.Count.Equals(0)

时间:2013-02-15 07:59:31

标签: c#

你不写的理由是什么

list.Count.Equals(0) 

你可能写的时候

list.Count == 0

是否存在技术/语义原因?

4 个答案:

答案 0 :(得分:5)

我认为这个具体案例的两个陈述没有区别。因为您正在检查int值的相等性; ==运算符和Equals执行完全相同的操作。

但是对于其他一些情况,例如对于以下情况,它们可能会返回不同的值;

Double.NaN == Double.NaN // is false
Double.NaN.Equals(Double.NaN) // is true

通常,对于值类型,您可以使用==;但如果它是引用类型,最好使用Equals

对于int,下面显示了样本的反汇编;生成的汇编代码不同,因此预期性能会有所不同;

            int a = 10;
00000080  mov         dword ptr [ebp-40h],0Ah 
                int b = 9;
00000087  mov         dword ptr [ebp-44h],9 

                bool x = a == b;
0000008e  mov         eax,dword ptr [ebp-40h] 
00000091  cmp         eax,dword ptr [ebp-44h] 
00000094  sete        al 
00000097  movzx       eax,al 
0000009a  mov         dword ptr [ebp-48h],eax 
                bool y = a.Equals(b);
0000009d  lea         ecx,[ebp-40h] 
000000a0  mov         edx,dword ptr [ebp-44h] 
000000a3  call        6B8803C0 
000000a8  mov         dword ptr [ebp-60h],eax 
000000ab  movzx       eax,byte ptr [ebp-60h] 
000000af  mov         dword ptr [ebp-4Ch],eax 

答案 1 :(得分:3)

两个主要原因是

  1. list.Count == 0更容易阅读(最重要的)

  2. list.Count.Equals(0)较慢

答案 2 :(得分:2)

list.Count == 0具有更好的可读性和更短的imo。如果性能可以忽略不计,那么总是更具可读性,并以最清晰的方式显示意图。

由于技术原因:如果比较两个生成的IL序列。

  IL_0029:  callvirt   instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
  IL_002e:  stloc.s    CS$0$0001
  IL_0030:  ldloca.s   CS$0$0001
  IL_0032:  ldc.i4.0
  IL_0033:  call       instance bool [mscorlib]System.Int32::Equals(int32) 
  // Equals(obj int) internally uses the method this == obj;

VS。

  IL_007f:  callvirt   instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
  IL_0084:  ldc.i4.0
  IL_0085:  ceq

有人可能认为==运算符更快,因为它使用更少的指令,没有人真正知道如何优化它。

使用JIT预热和首先调用的不同序列运行快速基准测试,您会注意到(至少在我的机器上)超过100000000个元素的迭代,==大约快25毫秒。

答案 3 :(得分:0)

我认为更具可读性

if (list.IsEmpty()) { ... } 

我不是C#专家,所以你最好在这里查看Recommended way to check if a sequence is empty如何让它发挥作用。