Ich habe gerade versucht, eine Klasse zu implementieren, in der uint
stattdessen zahlreiche Längen- / Zählungseigenschaften usw. vorhanden sind int
. Dabei bemerkte ich jedoch, dass es tatsächlich schmerzhaft ist, dies zu tun, als ob niemand das wirklich tun möchte.
Fast alles, was einen integralen Typ ausgibt int
, gibt ein zurück und erfordert daher Abgüsse an mehreren Punkten. Ich wollte ein StringBuffer
mit einer Pufferlänge erstellen, die standardmäßig auf eines der Felder in dieser Klasse eingestellt ist. Benötigt auch eine Besetzung.
Also fragte ich mich, ob ich einfach int
hierher zurückkehren sollte. Ich benutze sowieso nicht das gesamte Sortiment. Ich dachte nur, da das, womit ich mich dort beschäftige, einfach nicht negativ sein kann (wenn es so wäre, wäre es ein Fehler), wäre es eine gute Idee, es tatsächlich zu verwenden uint
.
PS: Ich habe diese Frage gesehen und dies erklärt zumindest, warum das Framework selbst immer verwendet, int
aber selbst im eigenen Code ist es tatsächlich umständlich, sich daran zu halten, uint
was mich denken lässt, dass es anscheinend nicht wirklich erwünscht ist.
Antworten:
Während Sie strikt
uint
für Variablen verwenden sollten, die eine nicht negative Ganzzahl enthalten, sind Sie auf einen der Gründe gestoßen, warum dies nicht immer praktikabel ist.In diesem Fall denke ich nicht, dass sich die Verringerung der Lesbarkeit, die mit dem Ausführen von Casts einhergeht, lohnt.
quelle
Ich werde zu den anderen Antworten auch hinzufügen, dass die Verwendung von uint als Typ eines öffentlichen Feldes, einer Eigenschaft, einer Methode, eines Parameters usw. einen Verstoß gegen die Regeln für die allgemeine Sprachspezifikation darstellt und nach Möglichkeit vermieden werden sollte.
quelle
Ein negativer Wert wird häufig verwendet, um einen Fehlerzustand zu signalisieren, und die Größe einer Operation wird häufig durch einen Funktionsaufruf zurückgegeben. Ein negativer Wert kann daher einen Fehler signalisieren, ohne auf einen Ausnahmemechanismus zurückzugreifen.
Beachten Sie auch, dass .NET häufig auf reinen C-Bibliotheken aufbaut. Daher ist es sinnvoll, diese Konvention fortzusetzen. Wenn Sie einen größeren Indexbereich benötigen, können Sie die Konvention für verschiedene Fehlersignalisierungsmechanismen brechen.
quelle
Mein persönliches Gefühl ist, dass Sie sich wahrscheinlich nur an int halten sollten. Es lohnt sich nicht, so ziemlich jedem einzelnen Eigenschaftszugriff eine Umwandlung hinzuzufügen, nur um einen numerischen Bereich zurückzugewinnen, den Sie in .NET wahrscheinlich sowieso nicht verwenden werden.
quelle
Die Verwendung eines int ist auch hilfreich, um einen Ganzzahlüberlauf in Operationen zu erkennen.
quelle
IMO, der Nachteil der Verwendung
uint
ist, dass es Fehlerbedingungen verdeckt. Die Entsprechungen des folgenden Codes sind nicht so schön:if (len < 0) terminate_program("length attained impossible value.");
Natürlich sollten Ihre Programme zunächst nichts falsch berechnen, aber ich denke, sie sollten auch geschrieben werden, um numerische Fehler ohne Ausbreitung schnell zu erkennen. In dem Fall, in dem ein MaxValue von 2 ^ 31 ausreicht, sage ich Verwendung
int
zusammen mit der richtigen VerwendungSystem.Diagnostics.Debug.Assert()
und entsprechenden Fehlerprüfungen, wie oben beispielhaft dargestellt.Wenn Sie es verwenden,
uint
verwenden Sie es zusammen mitchecked
, um einen Unterlauf zu verhindern und die gleichen Ergebnisse zu erzielen. Ich habe jedoch festgestellt, dass die Überprüfung auf vorhandenen Code, der für einen bestimmten Zweck Casts verwendet, etwas schwierig ist.quelle
Schwimmen Sie nicht flussaufwärts, wenn Sie nicht müssen. Wenn Sie Ihren Code nicht mit Casts lesen, ist Ihr Code besser lesbar. Wenn Ihre möglichen Werte in ein int passen, ist die Verwendung eines int kein Problem.
Wenn Sie befürchten, dass Sie ein int überlaufen könnten, dann auf jeden Fall ... aber nicht vorzeitig optimieren.
Ich würde sagen, dass die verbesserte Lesbarkeit der Minimierung von Casts das leicht erhöhte Risiko eines Fehlers bei der Verwendung von int überwiegt.
quelle
Wenn Sie überprüfen möchten, ob ein Wert positiv ist, ist es wahrscheinlich besser, nur assert zu verwenden (beachten Sie, dass dies nur eine Debugging-Technik ist - Sie sollten sicherstellen, dass dies im endgültigen Code niemals vorkommt).
using System.Diagnostics; ... Debug.Assert (i > 0);
quelle
ArgumentOutOfRangeException
.