我想知道,因爲MSDN文檔說明如下:有沒有已知的.CompareTo(object value)方法的實現返回一個小於-1或大於1的值?
小於零:此實例小於值。
零:此實例等於值。
大於零:此實例大於值。
如果您只是想比較一個小於等於或大於的值,爲什麼不使用-1,0和1呢?
我想知道,因爲MSDN文檔說明如下:有沒有已知的.CompareTo(object value)方法的實現返回一個小於-1或大於1的值?
小於零:此實例小於值。
零:此實例等於值。
大於零:此實例大於值。
如果您只是想比較一個小於等於或大於的值,爲什麼不使用-1,0和1呢?
這裏要考慮兩件事情。
實際的執行可能目前始終返回-1,0或1,從來沒有別的。請注意,我沒有驗證過這一點。
但是,文檔指定使用負值和正值而不僅僅是-1和+1是合法的。
這意味着要使用.CompareTo
編寫健壯的代碼,您需要處理負值和正值,而不僅僅是-1和+1。
請注意,這並不意味着您不能返回 -1和從您自己的CompareTo
實現+1,但是您還需要爲其他任何值做好準備。
爲簡單起見,在某些情況下,實現可能只是返回從另一個值中減去一個值的結果,因此您將得到不是-1或+1的內容。
這個問題是可能的方式廣泛,但我至少知道在我的公司使用了許多這樣的實現的,因爲我寫了他們:
public int CompareTo(Student other)
{
return this.Grade - student.Grade;
}
+1但爲什麼不'返回Grade.CompareTo(student.Grade)'? :) – 2013-03-01 12:27:19
據我所知,有很多(特別是用戶定義的)。 MSDN是非特定的,因爲你不應該依賴它,只要有效,CompareTo出來的值並不重要。例如比較兩個int
是最快的減去它們。
一個實際的例子,這個程序打印88
。
static void Main(string[] args)
{
Int16 a = 100;
Int16 b = 12;
Console.WriteLine(a.CompareTo(b));
}
在做這個小調查時,我發現了一些起初似乎有點奇怪的事情。 Int16
(short
)使用該方法,但Int32
(int
)不和返回-1
,0
,1
。這可能是由於我們使用小於返回類型的整數(Int32
),其中最小值減去最大值將適合。
如果你會看在CompareTo
執行這種類型的Byte
,Int16
,等你會看到
public int CompareTo(short value)
{
return (this - value);
}
Int32
或Int64
比較沒有實現同樣的方式。更新:正如@ O.R.Mapper注意到的,因爲算術溢出。
因爲'short.MinValue - short.MaxValue'仍在'int'的範圍內 - CompareTo的返回類型,但是int.MinValue - int.MaxValue和Int64.MinValue - Int64.MaxValue '不是。 – 2013-03-01 12:33:14
@ O.R.Mapper非常好的趕上!謝謝 – 2013-03-01 12:34:15
因爲比較兩個整數的顯而易見的方法是返回a-b。 – 2013-03-01 12:23:42
@MichaelEdenfield:不是一個好方法。比較'int.MinValue'和'int.MinValue + 1'就像那樣,並且支持溢出相關的異常,我想呢? – 2013-03-01 12:27:52
@MichaelEdenfield:對不起 - 當然我的意思是'int.MinValue'和'int.MaxValue'。 – 2013-03-01 12:58:01