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:

  

Exception levée lorsqu'une arithmétique, la coulée, ou opération de conversion dans un contexte de résultats vérifiés dans un trop-plein.

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é:

  

Les valeurs calculées pour les longueurs de dimension sont validés comme suit. Si une ou plusieurs des valeurs sont inférieures à zéro, une System.OverflowException est levée et aucune autre mesure sont exécutées.

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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top