簡體   English   中英

為什么SByte和Int32 CompareTo()方法的行為不同?

[英]Why do the SByte and Int32 CompareTo() methods behave differently?

如果您運行以下代碼:

SByte w = -5;
Console.WriteLine(w.CompareTo(0));

Int32 x = -5;
Console.WriteLine(x.CompareTo(0));

SByte y = 5;
Console.WriteLine(y.CompareTo(0));

Int32 z = 5;
Console.WriteLine(z.CompareTo(0));

然后你得到以下輸出:

-5
-1
5
1

為什么這些具有相同名稱的方法在MSDN文檔中的描述幾乎完全相同?

因為實現了SByte.CompareTo()

return m_value - value;

所以簡單的減法。 這工作,因為m_value自動轉換為int ,和值的任意組合的不可能性是“合法”與int

使用兩個Int32無法完成,因為例如Int32.MinValue.CompareTo(Int32.MaxValue)將變為Int32.MinValue - Int32.MaxValue ,它將在int范圍之外,實際上它實現為兩個比較:

if (m_value < value) return -1;
if (m_value > value) return 1;
return 0;

一般來說

CompareTo返回值的唯一重要“事物”是它的符號(或者如果它是0)。 “價值”無關緊要。 CompareTo()的返回值CompareTo()是相同的。 CompareTo不能用於測量數字之間的“距離”。 所以兩種實現都是等價的。

這樣做是完全錯誤的:

if (someValue.CompareTo(someOtherValue) == -1)

你必須永遠

if (someValue.CompareTo(someOtherValue) < 0)

為什么SByte.CompareTo以這種方式構建

SByte.CompareTo正在實現“無SByte.CompareTo ”比較(代碼中沒有if ,代碼流是線性的)。 處理器存在分支問題,因此無分支代碼可能比“分支”代碼更快,因此這種微優化。 顯然, SByte.CompareTo可以寫成Int32.CompareTo

為什么任何負值等於-1(任何正值等於+1)

這可能是直接從C語言派生的: qsort函數,例如比較項使用用戶定義的方法,如:

指向比較兩個元素的函數的指針。
qsort重復調用此函數以比較兩個元素。 它應遵循以下原型:

int compar(const void * p1,const void * p2);

將兩個指針作為參數(都轉換為const void *)。 該函數通過返回(以穩定和傳遞的方式)定義元素的順序:
返回值的含義
<0 p1指向的元素在p2指向的元素之前
0 p1指向的元素等效於p2指向的元素
> 0 p1指向的元素位於p2指向的元素之后

.CompareTo如何在其他原始類型中實現?

SByteByteInt16UInt16Char都使用減法“方法”,而Int32UInt32Int64UInt64都使用if “方法”。

查看這兩種方法的來源,它們的實現方式不同:

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

VS

public int CompareTo(int value)
{
    if (this < value)
    {
        return -1;
    }

    if (this > value)
    {
        return 1;
    }

    return 0;
 }

但這一切都不重要,因為返回值的符號是您應該檢查的唯一內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM