2011-12-27 86 views
9

IComparable的行爲,我在我的一個類實現IComparableIComprable<T>。是否有關於如何給出一個空參數時,在每種情況下CompareTo方法應該表現的任何建議?如果它返回一個正數或拋出ArgumentNullException?或者,這種行爲可能因實施課程而異?爲空參數

我看到了MSDN文檔(herehere),但在這個問題上沒有什麼可說的。任何幫助將不勝感激。

回答

9

IComparable.CompareTo()IComparable<T>.CompareTo()狀態這兩種MSDN引用以下:

根據定義,任何物體進行比較大於(或如下)Nothing,以及兩個空引用比較彼此相等。

在VB Nothing對應於null在C#。

注意,前一段狀態:

比較的意思,「小於」,「等於」和「大於」,取決於具體的實施。

但是不是null的實例引用總是大於空引用,無論你如何比較類的實例。

12

我看到的MSDN文檔,但它沒有任何關於這個問題

是它確實說了,但不是很清楚。該文檔指出:

根據定義,任何對象比較大於(或跟隨)無,並且兩個空引用相互比較相等。

該文檔令人困惑,因爲它混合了C#(null)和VB(Nothing)中的成語在同一句中。我會把它提到文檔管理器。

注意,規則同樣適用於空值類型。如果要排序可空整數列表,說出來的話1被認爲是比空排序的目的更大。小心;這不是在C#中默認比較可空的整數的方式。

+0

請注意,如果您單擊http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx頁上的語法下的C#選項卡,則文本將更改爲「...比較大於(或接着)爲空,以及兩個空引用......「 – phoog 2011-12-27 16:20:41

+0

@phoog:很好!我沒有注意到這一點。 – 2011-12-27 16:28:50

5

確保使用Object.ReferenceEquals來測試傳遞給CompareTo的參數是否爲null。避免使用==和!=運營商的CompareTo方法,因爲有人可能實際上按照MSDN建議委派的經營者回CompareTo方法,這反過來會創造在一眨眼的功夫無限循環和堆棧溢出(!)。

這裏是一個模型,你會如何嘗試實現CompareTo方法:

public class Piano : IComparable<Piano> 
{ 

    public float Mark { get; set; } 

    public int CompareTo(Piano other) 
    { 
     // The very basic implementation of CompareTo 

     if (object.ReferenceEquals(other, null)) 
      return 1; // All instances are greater than null 

     return Mark.CompareTo(other.Mark); 

    } 

} 

this地址說明整個源代碼。