5 Stimmen

Warum ist CompareTo on short auf diese Weise implementiert?

Betrachten Sie den folgenden Code:

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();
        }
    } 
}

Meine Frage ist, gibt es irgendwelche spezifischen Gründe, die die CompareTo-Methode auf Int16 andere Werte als -1, 0 und 1 zurückgibt?

ILSpy zeigt, dass es folgendermaßen implementiert ist

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

wohingegen die Methode für Int32 folgendermaßen implementiert wird

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

13voto

Jon Skeet Punkte 1325502

Der Unterschied besteht darin, dass für short ist ein Überlaufen des Ergebnisses unwahrscheinlich. Zum Beispiel, short.MinValue - (short) 1 immer noch negativ ist - während int.MinValue - 1 es int.MaxValue .

Mit anderen Worten, der besondere Grund dafür ist, dass Sie mit einer Abkürzung davonkommen können short (kein Wortspiel beabsichtigt), wohingegen die gleiche Abkürzung nicht funktioniert mit int . Sie sollten auf keinen Fall erfordern IComparable<T>.CompareTo Implementierungen, die -1, 0 oder 1 zurückgeben. Die Dokumentation ist ziemlich eindeutig, dass das Ergebnis nur in Form von negativ, null oder positiv sinnvoll ist.

5voto

Marc Gravell Punkte 970173

Nun, Sie sollten wirklich nur das Zeichen überprüfen trotzdem , sondern aus Gründen: Ich denke, für int usw. bestünde die Gefahr eines Überlaufs (bei der Verarbeitung von 2 großen Zahlen), der das Vorzeichen umkehren würde, d. h. muss überprüfen Sie die Betreiber.

Mir wäre es lieber, wenn es einheitlich wäre, aber das scheint kein Problem zu sein. Wahrscheinlich handelt es sich eher um eine Optimierung, die untypisch ist, aber innerhalb der dokumentierten API liegt. Insbesondere die Optimierung von short hier nicht das Gefühl, dass es einen Erfolg geben wird. massiv Umfang der Nutzung (I verwenden. short , aber nichts wie so sehr wie ich es tue int ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X