2013-03-01 86 views
4

我想知道,因爲MSDN文檔說明如下:有沒有已知的.CompareTo(object value)方法的實現返回一個小於-1或大於1的值?

小於零:此實例小於值。

零:此實例等於值。

大於零:此實例大於值。

如果您只是想比較一個小於等於或大於的值,爲什麼不使用-1,0和1呢?

+3

因爲比較兩個整數的顯而易見的方法是返回a-b。 – 2013-03-01 12:23:42

+1

@MichaelEdenfield:不是一個好方法。比較'int.MinValue'和'int.MinValue + 1'就像那樣,並且支持溢出相關的異常,我想呢? – 2013-03-01 12:27:52

+0

@MichaelEdenfield:對不起 - 當然我的意思是'int.MinValue'和'int.MaxValue'。 – 2013-03-01 12:58:01

回答

4

這裏要考慮兩件事情。

  1. 什麼是記錄
  2. 什麼是實現

實際的執行可能目前始終返回-1,0或1,從來沒有別的。請注意,我沒有驗證過這一點。

但是,文檔指定使用負值和正值而不僅僅是-1和+1是合法的。

這意味着要使用.CompareTo編寫健壯的代碼,您需要處理負值和正值,而不僅僅是-1和+1。

請注意,這並不意味着您不能返回 -1和從您自己的CompareTo實現+1,但是您還需要爲其他任何值做好準備。

爲簡單起見,在某些情況下,實現可能只是返回從另一個值中減去一個值的結果,因此您將得到不是-1或+1的內容。

4

這個問題是可能的方式廣泛,但至少知道在我的公司使用了許多這樣的實現的,因爲我寫了他們:

public int CompareTo(Student other) 
{ 
    return this.Grade - student.Grade; 
} 
+3

+1但爲什麼不'返回Grade.CompareTo(student.Grade)'? :) – 2013-03-01 12:27:19

1

據我所知,有很多(特別是用戶定義的)。 MSDN是非特定的,因爲你不應該依賴它,只要有效,CompareTo出來的值並不重要。例如比較兩個int是最快的減去它們。

一個實際的例子,這個程序打印88

static void Main(string[] args) 
{ 
    Int16 a = 100; 
    Int16 b = 12; 
    Console.WriteLine(a.CompareTo(b)); 
} 

在做這個小調查時,我發現了一些起初似乎有點奇怪的事情。 Int16short)使用該方法,但Int32int)不和返回-101。這可能是由於我們使用小於返回類型的整數(Int32),其中最小值減去最大值將適合。

2

如果你會看在CompareTo執行這種類型的ByteInt16,等你會看到

public int CompareTo(short value) 
{ 
    return (this - value); 
} 

Int32Int64比較沒有實現同樣的方式。更新:正如@ O.R.Mapper注意到的,因爲算術溢出。

+3

因爲'short.MinValue - short.MaxValue'仍在'int'的範圍內 - CompareTo的返回類型,但是int.MinValue - int.MaxValue和Int64.MinValue - Int64.MaxValue '不是。 – 2013-03-01 12:33:14

+0

@ O.R.Mapper非常好的趕上!謝謝 – 2013-03-01 12:34:15

相關問題