在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#引用值類型
- 3. 對值類型和引用類型使用C#LINQ表達式
- 4. 引用和值類型
- 5. 值和引用類型
- 6. 在C#中,使用的值類型與引用類型
- 7. C#引用類型賦值VS值類型賦值
- 8. 對值類型和引用類型使用不同的函數簽名
- 9. C#中值類型和引用類型之間有什麼區別?
- 10. 引用類型.NET中的值類型
- 11. 引用類型與值類型
- 12. 值類型字段是引用類型?
- 13. 在引用類型和值類型在C#規範輕微混亂
- 14. 什麼時候在C#中有用的值類型/引用類型約束?
- 15. 結構和類/值類型與引用類型
- 16. C# - 引用類型引用另一個引用類型
- 17. C++不具有類類型
- 18. 具有值類型鍵和引用類型值的通用字典
- 19. 所有類型的零值?
- 20. 正在創建一個接受(可爲空)值類型和引用類型的C#泛型方法嗎?
- 21. 類型不能用作索引類型
- 22. 確定類型是引用類型還是值類型
- 23. Rails不同類型的模型有不同的字段數和字段類型
- 24. 從C#方法返回不同類型
- 25. Mono.Cecil類型引用類型?
- 26. 引用類型在VB.NET中的行爲類似於值類型
- 27. C++ variadic模板,具有不同類型的非類型參數
- 28. C# - 值類型的引用包裝
- 29. Swift中的值類型和引用類型
- 30. 更好地理解Swift中的引用類型和值類型
他已經打敗你了! – leppie 2010-03-01 21:31:58
是的,他在46秒內擊敗了我!當我在寫我的回答時,我知道Jon會提供一個非常好的答案。 – Kelsey 2010-03-01 22:59:51