2011-07-05 9 views
5

は、次のコードを考えてみましょう:なぜこのように実装された短縮型のCompareToですか?

namespace ConsoleApplication1 { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(100.CompareTo(200)); // prints -1 
      Console.WriteLine(((decimal)100).CompareTo((decimal)200)); // prints -1 
      Console.WriteLine(((short)100).CompareTo((short)200)); // prints -100 
      Console.WriteLine(((float)100).CompareTo((float)200)); // prints -1 
      Console.ReadKey(); 
     } 
    } 
} 

私の質問です、Int16型でのCompareToメソッドは-1、0と1以外の値を返す任意の特定の理由がありますか?

ILSpyは、それがこのよう

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

実装されている示しメソッドは、このよう

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

答えて

13

のInt32にimplentedされるのに対し、違いはshortため、溢れ結果のチャンスがありませんということです。例えば、short.MinValue - (short) 1は依然として負であり、一方、int.MinValue - 1int.MaxValueである。

つまり、具体的な理由はshortのショートカットを使用することができますが、同じショートカットはintでは機能しません。 は、IComparable<T>.CompareToの実装が-1,0または1を返すようにする必要はありません。ドキュメントは、結果が負、ゼロ、または正であることのみが意味を持つことは明らかです。

+1

あなたの答えをありがとう。オーバーフローの問題については考えなかった。残念ながら、CompareToが常に-1、0、または1を返すと仮定して、多くのコードを含むレガシーアプリケーションを維持する必要があります。 – sloth

+1

@dkson:レガシーコードを修正することをお勧めします。あなたが最終的にそれを修正するまで、そのような仮定は単純にあなたを噛み続けるでしょう。後ではなく早くやり直すことをお勧めします。また、元の開発者を教育します。 –

5

さて、あなただけの本当にとにかく看板をチェックしますが、理由のために必要があります:私は(2、大の大きさの数字を処理するとき)オーバーフロー/ラップの危険性があるだろうintなどのために推測符号を逆にすることを、それを意味するオペレータを確認する必要があります。

私はむしろ一貫していると思いますが、問題はないようです。非定型ですが、文書化されたAPI内の最適化の可能性が高いです。特に、使用の膨大な量を得るために起こっているように感じることはありませんここにshortを最適化する(私はintがそうであるように、私はのような多くをshortではなく、何もを使う)。

関連する問題