2011-03-03 38 views
1

我想確定。如果我在兩個類型的操作數之間應用==運算符,那麼當兩個變量指向同一個對象時它會返回true? 也類似於字符串類,以基於例如有些價值,我需要重寫該操作符。真的嗎?使用==運算符爲類類型操作數

+0

你是什麼意思的「類型」?請舉個具體的例子。 – 2011-03-03 09:00:15

回答

1

對於第二個問題,給==特殊的意義,你確實需要重載(未覆蓋)的運營商(和=在同一時間!):

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
2

==的默認實現在引用類型上使用引用相等,即當且僅當它們是相同的實例時,對象才相等。

您可以重載==!=運算符。如果這樣做,爲了保持一致性,還應該覆蓋EqualsGetHashCode()。如果您也不覆蓋那些使用==!=只會得到正確的相等性,但許多其他用途,例如DictionaryHashSet仍將使用引用相等。

您總是需要將==!=過載在一起。通常我在==中自己寫比較,並使用==表示其他比較。

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內時,平等不得改變,並且使其完全不可變,從而節省大量麻煩。既然你只能使用不可變類實現價值語義,並且重寫相等的目標正在獲得價值語義,你基本上需要不變性。

+0

如果您給它一個錯誤類型的對象,Your Equals方法將拋出一個異常,而不是僅返回false。 – 2011-03-03 09:09:57

+0

謝謝,這就是我沒有使用視覺工作室'等''片段。 – CodesInChaos 2011-03-03 09:12:00

2

是的,==運算符比較引用是否指向同一對象。

在字符串,它比較eqality(不像在Java中)

1

==會爲實例x返回true和y如果:

  • xy是同一類型的
  • xy要麼是相同的實例,要麼是它們所代表的類型已經超載了==運算符,並且根據它們進行比較。
0

這是從MSDN全explanation
是的,它確實比較了類/對象實例的引用。

相關問題