Frage

Meistens stellen wir Konzepte dar, die niemals kleiner als 0 sein können.Um beispielsweise die Länge anzugeben, schreiben wir:

int length;

Der Name drückt seinen Zweck gut aus, aber Sie können ihm auch negative Werte zuweisen.Es scheint, dass Sie Ihre Absicht in manchen Situationen klarer zum Ausdruck bringen können, indem Sie sie stattdessen folgendermaßen schreiben:

uint length; 

Einige Nachteile, die mir einfallen:

  • Vorzeichenlose Typen (uint, ulong, ushort) sind nicht CLS-kompatibel, sodass Sie sie nicht mit anderen Sprachen verwenden können, die dies nicht unterstützen
  • .Net-Klassen verwenden meistens vorzeichenbehaftete Typen, sodass Sie eine Umwandlung durchführen müssen

Gedanken?

War es hilfreich?

Lösung

"Wenn du in Rom bist, mach wie es die Römer tun."

Obwohl es theoretisch einen Vorteil bietet, ggf. vorzeichenlose Werte zu verwenden, da der Code dadurch aussagekräftiger wird, ist dies in C# einfach nicht möglich.Ich bin mir nicht sicher, warum die Entwickler die Schnittstellen zunächst nicht so gestaltet haben, dass sie verarbeitet werden können uints und den Typ CLS konform machen, aber jetzt hat der Zug den Bahnhof verlassen.

Da Konsistenz im Allgemeinen wichtig ist, würde ich empfehlen, den C#-Weg zu wählen und zu verwenden intS.

Andere Tipps

Wenn Sie eine vorzeichenbehaftete Zahl mit dem Wert 0 dekrementieren, wird sie negativ und Sie können dies leicht testen.Wenn Sie eine vorzeichenlose Zahl mit dem Wert 0 dekrementieren, läuft sie unter und wird zum Maximalwert für den Typ – was die Überprüfung etwas schwieriger macht.

Ihr zweiter Punkt ist der wichtigste.Im Allgemeinen sollten Sie einfach verwenden int denn das ist ein ziemlich gutes Allheilmittel für ganzzahlige Werte.Ich würde nur verwenden uint wenn Sie unbedingt die Fähigkeit benötigen, höher zu zählen int, aber ohne den zusätzlichen Speicher zu nutzen long erfordert (es ist nicht viel mehr Speicher, also seien Sie nicht billig :-p).

Ich denke, die subtile Verwendung von uint vs.int wird bei Entwicklern zu Verwirrung führen, es sei denn, es wurde in die Entwicklerrichtlinien des Unternehmens aufgenommen.

Wenn die Länge beispielsweise nicht kleiner als Null sein darf, sollte sie in der Geschäftslogik klar ausgedrückt werden, damit zukünftige Entwickler den Code lesen und die wahre Absicht kennen können.

Nur meine 2 Cent.

Ich möchte darauf hinweisen, dass Sie in C# einschalten können /checked um auf arithmetischen Überlauf/Unterlauf zu prüfen, was sowieso keine schlechte Idee ist.Wenn es in einem kritischen Abschnitt auf die Leistung ankommt, können Sie es trotzdem verwenden unchecked um es zu umgehen.

Für internen Code (dh Code, auf den in keiner Interoperabilität mit anderen Sprachen verwiesen wird) stimme ich für die Verwendung von unsigned, wenn die Situation dies erfordert, z. B length Variablen wie bereits erwähnt.Dies stellt zusammen mit der geprüften Arithmetik ein weiteres Netz für Entwickler bereit, das subtile Fehler früher erkennt.

Ein weiterer Punkt in der Debatte mit Vorzeichen und ohne Vorzeichen ist, dass einige Programmierer Werte wie -1 verwenden, um Fehler anzuzeigen, wenn sie sonst keine Bedeutung hätten.Ich stimme der Ansicht zu, dass jede Variable nur einen Zweck haben sollte, aber wenn Sie – oder Kollegen, mit denen Sie programmieren – Fehler auf diese Weise angeben möchten, haben Sie durch das Signieren von Variablen die Flexibilität, später Fehlerzustände hinzuzufügen.

Ihre beiden Punkte sind gut.Der Hauptgrund, dies zu vermeiden, ist jedoch das Casting.Das Casting macht ihre Verwendung unglaublich nervig.Ich habe einmal versucht, vorzeichenlose Variablen zu verwenden, musste aber überall Casts verteilen, da die Framework-Methoden alle vorzeichenbehaftete Ganzzahlen verwenden.Daher müssen Sie bei jedem Aufruf einer Framework-Methode eine Umwandlung durchführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top