回答
我認爲這個具體案例的兩個陳述之間沒有區別。由於您正在檢查值爲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
的兩個主要原因是
list.Count == 0是更容易閱讀(最重要的)
list.Count.Equals(0)是較慢
你爲什麼覺得它慢?我認爲int的運算符重載使用Equals覆蓋。 – abatishchev 2013-02-15 08:02:14
對我來說,原因是等於參考類型不是值類型,如整數。 – Elisabeth 2013-02-15 08:04:08
int上的等於不會被裝箱。 – Alex 2013-02-15 08:07:14
我覺得更易讀是
if (list.IsEmpty()) { ... }
我不是一個C#專家,所以你最好先檢查一下這裏Recommended way to check if a sequence is empty如何使其發揮作用。
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;
與
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 ms。
- 1. 爲什麼我要寫c - '0'而不是c?
- 2. 爲什麼我的NSRange始終爲0?
- 3. 爲什麼我的GZipStream不可寫入?
- 4. Python,爲什麼我不能重寫Popen.stdout
- 5. 爲什麼我們不能重寫`||`和`&&`?
- 6. 爲什麼我不能重寫父類?
- 7. 爲什麼不爲空(0)返回false?
- 8. 爲什麼xspeed!= 0?
- 9. 爲什麼bytes.length = 0?
- 10. 爲什麼我的JQuery返回init [0]的長度爲0?
- 11. 爲什麼我需要libprofiler.so.0
- 12. PHP - 我得到真(0 =='undefined'),爲什麼?
- 13. 爲什麼我會收到「ArrayIndexOutOfBoundsException:0」?
- 14. ArcObjects:爲什麼我的StandaloneTableCount 0? (IStandaloneTableCollection)
- 15. 爲什麼mysqli_insert_id返回我0
- 16. 爲什麼我的「Page [0]」不在我的網頁中?
- 17. 爲什麼JavaScript中的「0 === -0」爲true?
- 18. 爲什麼我的向量<int>不是默認爲0?
- 19. 計算值始終爲0,我不知道爲什麼
- 20. 爲什麼`null> = 0 && null <= 0`但不是`null == 0`?
- 21. 爲什麼輸出爲0?
- 22. 爲什麼不重寫URL?
- 23. 爲什麼五個0爲什麼不是1到5
- 24. 爲什麼不能爲單行向量x [:,0] = x [0]?
- 25. 爲什麼retainCount是0而不是1?
- 26. 爲什麼TCusomWinSocket.ReceiveBuf不會返回0?
- 27. 爲什麼0.1 * 10-1不等於0?
- 28. while(0)爲什麼不執行代碼?
- 29. 爲什麼cvWaitKey(0)不起作用?
- 30. string.Compare不返回0爲什麼?
第二種情況更具可讀性,不是嗎? – abatishchev 2013-02-15 08:01:28
這取決於'list'實際是什麼('Equals'可能有不同於'operator =='的覆蓋,但它只是愚蠢的)。一般來說,'list.Any()'是檢查空列表的首選方法。 – 2013-02-15 08:02:11
@ArtemKoshelev:這取決於'list.Count'實際是什麼。 – 2013-02-15 08:13:08