我想確定。如果我在兩個類型的操作數之間應用==運算符,那麼當兩個變量指向同一個對象時它會返回true? 也類似於字符串類,以基於例如有些價值,我需要重寫該操作符。真的嗎?使用==運算符爲類類型操作數
回答
對於第二個問題,給==特殊的意義,你確實需要重載(未覆蓋)的運營商(和=在同一時間!):
public class Test
{
public static bool operator ==(Test t1, Test t2)
{
// Insert logic here, being careful of the possibility of
// t1 and t2 being null. And don't just use if (t1 == null)
// - it will recurse!
}
public static bool operator !=(Test t1, Test t2)
{
// Usual way of implementing
return !(t1 == t2);
}
}
如果您「再超載==你應該幾乎肯定:
- 實施
IEquatable<T>
- 很有可能使類密封和不可變的(平等,可以改變的是麻煩) 個
- 重寫equals(對象)和GetHashCode
==的默認實現在引用類型上使用引用相等,即當且僅當它們是相同的實例時,對象才相等。
您可以重載==
和!=
運算符。如果這樣做,爲了保持一致性,還應該覆蓋Equals
和GetHashCode()
。如果您也不覆蓋那些使用==
和!=
只會得到正確的相等性,但許多其他用途,例如Dictionary
或HashSet
仍將使用引用相等。
您總是需要將==
和!=
過載在一起。通常我在==
中自己寫比較,並使用==
表示其他比較。
public static bool operator ==(MyClass x, MyClass y)
{
}
public static bool operator !=(MyClass x, MyClass y)
{
return !(x==y);
}
public override bool Equals(object obj)
{
if((obj==null)||(obj.GetType()!=typeof(MyClass))
return false;
return this==(MyClass)obj;
}
public override int GetHashCode()
{
}
而且你應該考慮讓類不可變。當對象位於HashSet或Dictionary內時,平等不得改變,並且使其完全不可變,從而節省大量麻煩。既然你只能使用不可變類實現價值語義,並且重寫相等的目標正在獲得價值語義,你基本上需要不變性。
如果您給它一個錯誤類型的對象,Your Equals方法將拋出一個異常,而不是僅返回false。 – 2011-03-03 09:09:57
謝謝,這就是我沒有使用視覺工作室'等''片段。 – CodesInChaos 2011-03-03 09:12:00
是的,==運算符比較引用是否指向同一對象。
在字符串,它比較eqality(不像在Java中)
==
會爲實例x
返回true和y
如果:
x
和y
是同一類型的x
和y
要麼是相同的實例,要麼是它們所代表的類型已經超載了==
運算符,並且根據它們進行比較。
這是從MSDN全explanation。
是的,它確實比較了類/對象實例的引用。
- 1. 操作符=運算符=子類父類
- 2. 運算符'??'不能應用於類型 'System.DateTime的' 的操作數
- 3. 運算符&&不能應用於'bool'類型的操作數
- 4. 不良操作數類型一元運算符'+++'的字符串
- 5. 不好操作數類型字符串元運算符「+」
- 6. 對於avg運算符,操作數數據類型nchar無效
- 7. 操作數數據類型varchar對乘法運算符無效
- 8. 不好操作類型爲二進制運算符「==」
- 9. 不好操作類型爲二進制運算符 「&」 的Java
- 10. 重載運算符[]爲非類類型
- 11. 二元運算符的不良操作數類型
- 12. 錯誤:錯誤的操作數類型的二元運算符「/」
- 13. 二元運算符'>'的不良操作數類型
- 14. 不同類型操作數的賦值運算符
- 15. 二元運算符「+」的不良操作數類型
- 16. 錯誤:二元運算符'||'的操作數類型錯誤
- 17. 二元運算符的錯誤操作數類型+
- 18. 二元運算符的錯誤操作數類型'<='
- 19. 錯誤:二元運算符「+」的操作數類型錯誤
- 20. 二元運算符的壞操作數類型' - '
- 21. 二元運算符的不良操作數類型%
- 22. 不好操作類型二元運算
- 23. Swift一元運算符'!'不能應用於類型爲'OLVideoCell'的操作數
- 24. 運算符'>'不能應用於類型爲'System.Diagnostics.Stopwatch'的操作數
- 25. C++:重載操作符。好奇類型轉換運算符
- 26. 運算符(操作數?)作爲參數
- 27. C++運算符()括號 - 運算符類型()與類型運算符()
- 28. 運算符==不能應用於字符串類型和int的操作數
- 29. 運算符'=='不能應用於'厚度'和'字符串'類型的操作數
- 30. 運算符'=='不能應用於字符串類型和枚舉的操作數
你是什麼意思的「類型」?請舉個具體的例子。 – 2011-03-03 09:00:15