Raison d'être OverflowException jeté avec la taille du tableau négatif?
-
04-10-2019 - |
Question
Après l'écriture de code qui peut se résumer à ce qui suit:
var size=-1;
var arr=new byte[size];
J'ai été surpris qu'il a jeté un OverflowException . Les documents pour OverflowException état:
Je ne pouvais pas voir comment fournir une taille négative et unique longueur de tableau dans la description donnée à cette exception, si fouilla un peu plus et a constaté que c'est en effet le comportement spécifié:
Je me demande pourquoi OverflowException a été choisi. Il est assez trompeur si vous me demandez. Cela m'a coûté au moins 5 minutes d'enquête (sans compter mes songeries ici). Quelqu'un peut-il faire la lumière sur ce (à ma pensée) décision de conception particulière?
La solution
Ceci est presque certainement une optimisation. Le code du framework .NET est assez religieux sur la vérification des arguments pour laisser tomber le programmeur dans la fosse de succès. Mais cela ne vient pas gratuitement. Le coût est assez minuscule, de nombreuses méthodes de classe prennent beaucoup plus de cycles de la machine que ce qui est consacré à la vérification.
Mais les tableaux sont spéciaux. Ils sont la structure de données très centrale dans le cadre. Presque toutes les classes de collection est construite au-dessus d'eux. Toute vente de tête dans la classe Array influe directement sur l'efficacité de beaucoup de code qui se trouve au-dessus de celui-ci. Éviter le contrôle est correct, il obtient implicitement vérifié de toute façon lorsque les besoins de code interne de jeter la valeur non signée. Et il est très rare qu'il déclenche. Donc le vérifier le meilleur message d'exception est deux fois pas tout à fait la peine.
Autres conseils
OverflowException , dans la documentation, définit essentiellement un trop-plein comme quelque chose que:
produit un résultat qui est en dehors de la plage du type de données
Dans ce cas, les valeurs négatives sont en dehors de la plage valide pour une taille de matrice (ou bien, de toute taille).
je pouvais voir l'argument selon lequel ArgumentOutOfRangeException pourrait être, à certains égards, mieux - cependant, il n'y a pas d'argument impliqué dans une définition de tableau (comme pas une méthode), donc, elle aussi, ne serait pas un choix parfait
.Il est peut-être parce que la taille est un entier non signé. Il stocke -1 en complément à deux, qui, lorsqu'il est regardé comme un unsigned int, est le nombre entier positif maximum qui peut être stocké. Si ce nombre est plus grand que la taille possible d'un tableau, il déborde.
Attention:. Ce pure spéculation