2010-09-21 4 views
6

Après l'écriture de code qui peut se résumer à ce qui suit:Raisonnement derrière OverflowException levé avec la taille de tableau négative?

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

J'ai été surpris qu'il a jeté un OverflowException. Les documents pour OverflowException état:

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

je ne pouvais pas voir comment fournir une taille négative et longueur du tableau s'insère dans la description donnée à cette exception, si plongèrent un peu plus et a constaté que c'est en effet le comportement spécifié:

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.

Je me demande pourquoi OverflowException a été choisi. C'est assez trompeur si vous me demandez. Cela m'a coûté au moins 5 minutes d'enquête (sans compter mes réflexions ici). Quelqu'un peut-il faire la lumière sur cette décision de conception particulière (à mon avis)?

+0

Semble raisonnable de me lancer cette exception. – cjk

+0

Comment est-ce un débordement de toute description? – spender

Répondre

8

Ceci est presque certainement une optimisation. Le code du framework .NET est assez religieux sur la vérification des arguments pour laisser le programmeur tomber dans la fosse du succès. Mais ça ne vient pas gratuitement. Le coût est assez minime, de nombreuses méthodes de classe prennent beaucoup plus de cycles de machine que ce qui est dépensé pour la vérification.

Mais les tableaux sont spéciaux. Ils sont la structure de données de base dans le cadre. Presque chaque classe de collection est construite sur eux. Toute surcharge placée dans la classe Array a un impact direct sur l'efficacité d'un grand nombre de code qui se trouve au-dessus. Éviter le contrôle est correct, il est implicitement vérifié quand le code interne doit convertir la valeur en unsigned. Et c'est très rare que ça trébuche. Donc, le vérifier deux fois ne vaut pas vraiment le meilleur message d'exception.

1

Il se peut que cette taille soit un entier non signé. Il stocke -1 dans le complément à deux, qui, lorsqu'il est considéré comme un entier non signé, est l'entier positif maximum qui peut être stocké. Si ce nombre est plus grand que la taille possible d'un tableau, il débordera.

Attention: c'est de la pure spéculation.

+0

Les tailles de tableau, en .NET, sont stockées en tant que Int32, non non signées. Je crois que cela a été fait afin de garder les tableaux CLS conformes. –

+0

Je pensais à l'origine selon ces lignes, mais la spécification est assez spécifique que c'est la taille négative qui provoque cette exception. – spender

5

OverflowException, dans la documentation, définit essentiellement un débordement comme quelque chose qui:

produit un résultat qui est en dehors de la plage du type de données

Dans ce cas, les valeurs négatives sont à l'extérieur de la plage valide pour une taille de tableau (ou vraiment, n'importe quelle taille).

Je pourrais voir l'argument que ArgumentOutOfRangeException pourrait être, à certains égards, mieux - cependant, il n'y a pas d'argument impliqué dans une définition de tableau (comme ce n'est pas une méthode), donc, aussi, ce ne serait pas un choix parfait .

Questions connexes