2010-09-21 4 views
6

Nachdem das Schreiben von Code, der folgend eingekocht werden kann:Rationale hinter OverflowException mit negativer Array-Größe geworfen?

var size=-1; 
var arr=new byte[size]; 

Ich war überrascht, dass es eine OverflowException warf. Die Dokumentation für OverflowException Zustand:

The exception that is thrown when an arithmetic, casting, or conversion operation in a checked context results in an overflow.

Ich konnte nicht sehen, wie eine negative Größe für die Bereitstellung und Feldlänge passt in die Beschreibung für diese Ausnahme gegeben, so forschte ein wenig tiefer und fand, dass dies ist in der Tat das angegebene Verhalten:

The computed values for the dimension lengths are validated as follows. If one or more of the values are less than zero, a System.OverflowException is thrown and no further steps are executed.

Ich frage mich, warum OverflowException gewählt wurde. Es ist ziemlich irreführend, wenn du mich fragst. Es kostete mich mindestens 5 Minuten Untersuchung (meine Gedanken hier nicht mitgerechnet). Kann jemand diese (zu meinem Denken) eigentümliche Designentscheidung beleuchten?

+0

Scheint vernünftig, diese Ausnahme zu mir zu werfen. – cjk

+0

Wie ist es ein Überlauf irgendeiner Beschreibung? – spender

Antwort

8

Dies ist fast sicher eine Optimierung. Der .NET-Framework-Code ist ziemlich religiös, Argumente zu überprüfen, um den Programmierer in die Falle des Erfolges fallen zu lassen. Aber das ist nicht kostenlos. Die Kosten sind ziemlich gering, viele Klassenmethoden benötigen viel mehr Maschinenzyklen als für die Überprüfung.

Aber Arrays sind speziell. Sie sind die Kerndatenstruktur im Framework. Fast jede Kollektionsklasse ist auf ihnen aufgebaut. Jeder Overhead in der Array-Klasse wirkt sich direkt auf die Effizienz einer Menge Code aus, der darüber liegt. Das Vermeiden der Überprüfung ist in Ordnung, sie wird jedoch implizit überprüft, wenn der interne Code den Wert in unsigned umwandeln muss. Und es ist sehr selten, dass es stolpert. Es ist also nicht die bessere Ausnahmebedingung wert, es zweimal zu prüfen.

1

Es könnte sein, weil diese Größe ein unsigned int ist. Es speichert -1 im Zweierkomplement, was, wenn es als vorzeichenloses int betrachtet wird, die maximale positive ganze Zahl ist, die gespeichert werden kann. Wenn diese Anzahl größer als die mögliche Größe eines Arrays ist, wird es überlaufen.

Warnung: Dies ist reine Spekulation.

+0

Array-Größen in .NET werden als Int32 gespeichert, nicht vorzeichenlos. Ich glaube, dies wurde getan, um Arrays CLS-konform zu halten. –

+0

Ich dachte ursprünglich in diese Richtung, aber die Spezifikation ist ziemlich spezifisch, dass es negative Größe ist, die diese Ausnahme verursacht. – spender

5

OverflowException, in der Dokumentation, im Grunde einen Überlauf als etwas definiert, das:

ein Ergebnis erzeugt, das außerhalb des Bereichs des Datentypen in diesem Fall sind

außerhalb negative Werte ist des gültigen Bereichs für eine Array-Größe (oder wirklich, jede Größe).

Ich könnte das Argument sehen, könnte in mancher Hinsicht besser sein - jedoch gibt es kein Argument in einer Array-Definition beteiligt (da es keine Methode), so dass es auch nicht eine perfekte Wahl wäre .

Verwandte Themen