Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Warum ist Array.Length ein int und kein a uint.Das stört mich (nur ein bisschen), weil ein Längenwert niemals negativ sein kann.

Dies zwang mich auch, ein INT für eine Länge in meiner eigenen Klasse zu verwenden, denn wenn Sie einen int-Wert angeben, muss dies explizit gegossen werden ...

Die ultimative Frage lautet also:Gibt es irgendeinen Nutzen für ein vorzeichenloses int (uint)?Sogar Microsoft scheint sie nicht zu nutzen.

War es hilfreich?

Lösung

Unsigned int ist nicht CLS-kompatibel und würde daher die Verwendung der Eigenschaft auf die Sprachen beschränken, die a implementieren UInt.

Siehe hier:

Rahmen 1.1

Einführung in die .NET Framework-Klassenbibliothek

Rahmen 2.0

Übersicht über die .NET Framework-Klassenbibliothek

Andere Tipps

Viele Gründe:

  • uint ist nicht CLS-kompatibel, daher wäre es problematisch gewesen, einen integrierten Typ (Array) davon abhängig zu machen
  • Die ursprünglich entworfene Laufzeit verhindert, dass Objekte auf dem Heap mehr als 2 GB Speicher belegen.Da die maximale Array-Größe, die kleiner oder gleich diesem Grenzwert wäre, new byte[int.MaxValue] wäre, wäre es für Menschen rätselhaft, positive, aber illegale Array-Längen generieren zu können.
  • Historisch gesehen hat C# einen Großteil seiner Syntax und Konvention von C und C++ geerbt.In diesen Arrays handelt es sich lediglich um Zeigerarithmetik, sodass eine negative Array-Indizierung möglich war (obwohl dies normalerweise illegal und gefährlich ist).Da ein Großteil des vorhandenen Codes davon ausgeht, dass der Array-Index signiert ist, wäre dies ein Faktor gewesen
  • In diesem Zusammenhang bedeutet die Verwendung von vorzeichenbehafteten Ganzzahlen für Array-Indizes in C/C++, dass die Interoperabilität mit diesen Sprachen und nicht verwalteten Funktionen unter diesen Umständen ohnehin die Verwendung von Ints erfordern würde, was aufgrund der Inkonsistenz zu Verwirrung führen kann.
  • Die BinarySearch-Implementierung (eine sehr nützliche Komponente vieler Algorithmen) basiert auf der Möglichkeit, den negativen Bereich des int zu verwenden, um anzuzeigen, dass der Wert nicht gefunden wurde Und die Position, an der ein solcher Wert eingefügt werden sollte, um die Sortierung aufrechtzuerhalten.
  • Wenn Sie ein Array bearbeiten, möchten Sie wahrscheinlich einen negativen Offset eines vorhandenen Index verwenden.Wenn Sie einen Offset verwenden würden, der Sie mit Unit über den Anfang des Arrays hinausführen würde, würde das Wrap-Around-Verhalten Ihren Index möglicherweise legal machen (da er positiv ist).Mit einem int wäre das Ergebnis illegal (aber sicher, da die Laufzeit vor dem Lesen ungültigen Speichers schützen würde)

Ich denke, es könnte auch mit der Vereinfachung der Dinge auf einer niedrigeren Ebene zu tun haben, da Array.Length natürlich irgendwann zu einer negativen Zahl addiert wird, wenn Array.Length ohne Vorzeichen wäre, und zu einem negativen int (Zweierkomplement) addiert wird. , könnte es zu unordentlichen Ergebnissen kommen.

Es sieht so aus, als hätte niemand eine Antwort auf die „ultimative Frage“ gegeben.

Ich glaube, dass unsigned ints in erster Linie dazu dienen, eine einfachere Schnittstelle zu externen Systemen (P/Invoke und dergleichen) bereitzustellen und die Anforderungen verschiedener Sprachen zu decken, die auf .NET portiert werden.

In der Regel werden ganzzahlige Werte mit Vorzeichen versehen, es sei denn, Sie benötigen ausdrücklich einen vorzeichenlosen Wert.Es liegt einfach an der Art und Weise, wie sie verwendet werden.Vielleicht bin ich mit dieser Wahl nicht einverstanden, aber es ist einfach so.

Wenn Ihr Array oder eine ähnliche Datenstruktur angesichts der heute üblichen Speicherbeschränkungen eine UInt32-Länge benötigt, sollten Sie vorerst andere Datenstrukturen in Betracht ziehen.

Mit einem Array von Bytes erhalten Sie mit Int32 2 GB an Werten

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