在Java中,引用類型有「==」和「equals」運算符,值類型有「==」。對於引用類型,「==」表示兩個對象指向相同的位置,「等於」表示它們的值相同。 C#是否有類似的值類型和引用類型的運算符?C#==在值類型和引用類型方面有所不同?
12
A
回答
15
那麼,==可以重載參考類型。例如:
string a = new string('x', 10);
string b = new string('x', 10);
Console.WriteLine(a == b); // True
Console.WriteLine(Object.ReferenceEquals(a, b)); // False
除非它被重載,否則==表示引用類型的「引用相等」,即「對象標識」。 (正如Marc所說,你可以覆蓋Equals
而不會超載==。)
對於值類型,你必須重載==,否則C#編譯器不會讓你使用它進行比較。 .NET本身將提供一個實現Equals
,通常做的是正確的事情,但有時候會很慢 - 在大多數情況下,如果你編寫自己的自定義值類型,則需要實現IEquatable<T>
並覆蓋Equals
- 並且很可能會超載各種運營商。
8
C#允許==
操作超載(和被覆蓋的Equals
方法 - 雖然==
和Equals
不有意味着同樣的事情)。
如果你想表示「同一個實例」,那麼object.ReferenceEquals
(對於引用類型)是最好的選擇。值類型默認爲內部相等。
2
0
這恰恰是它與.NET工程,以及道路。該C# FAQ blog explains equals better:
equals方法只是一個虛擬 一個在System.Object的定義,並通過 爲準類選擇 重寫這樣做。 ==運算符是一個 運算符,它可以通過 類重載,但通常具有 標識行爲。
對於在==沒有 被重載引用類型,比較 兩個引用是否指向同一個對象 - 這也正是 實施的Equals的確實在 System.Object的。
1
什麼時候應該使用==,什麼時候應該使用Equals?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
相關問題
- 1. c#值類型和引用類型
- 2. 對值類型和引用類型使用C#LINQ表達式
- 3. 引用和值類型
- 4. 值和引用類型
- 5. 在C#中,使用的值類型與引用類型
- 6. C#引用類型賦值VS值類型賦值
- 7. 對值類型和引用類型使用不同的函數簽名
- 8. C#中值類型和引用類型之間有什麼區別?
- 9. 值類型字段是引用類型?
- 10. 在引用類型和值類型在C#規範輕微混亂
- 11. 什麼時候在C#中有用的值類型/引用類型約束?
- 12. C# - 引用類型引用另一個引用類型
- 13. 所有類型的零值?
- 14. 正在創建一個接受(可爲空)值類型和引用類型的C#泛型方法嗎?
- 15. 類型不能用作索引類型
- 16. Rails不同類型的模型有不同的字段數和字段類型
- 17. 確定類型是引用類型還是值類型
- 18. 從C#方法返回不同類型
- 19. Mono.Cecil類型引用類型?
- 20. C# - 值類型的引用包裝
- 21. 引用不同類型結構的類型接口?
- 22. 直放站itemdatabound事件值類型和引用類型
- 23. 值類型和引用類型實時內存分配
- 24. 更好地理解Swift中的引用類型和值類型
- 25. Swift中的值類型和引用類型
- 26. 泛型函數來獲取所有類型和集合在C++
- 27. 不同類型的*值
- 28. 將C#引用類型克隆到派生引用類型
- 29. 不同的方法類型?
- 30. 類型不可知類在泛類中調用泛型和非泛型方法?
他已經打敗你了! – leppie 2010-03-01 21:31:58
是的,他在46秒內擊敗了我!當我在寫我的回答時,我知道Jon會提供一個非常好的答案。 – Kelsey 2010-03-01 22:59:51