Question

Cette question a déjà une réponse ici :

Pourquoi est-ce Array.Length un int, et non un uint.Cela me dérange (juste un peu) car une valeur de longueur ne peut jamais être négative.

Cela m'a également obligé à utiliser un INT pour une property en longueur sur ma propre classe, car lorsque vous spécifiez une valeur intrigue, cela doit être jeté explicitement ...

La question ultime est donc :y a-t-il une utilité pour un int non signé (uint) ?Même Microsoft ne semble pas les utiliser.

Était-ce utile?

La solution

Unsigned int n'est pas conforme à CLS et limiterait donc l'utilisation de la propriété aux langages qui implémentent un UInt.

Vois ici:

Cadre 1.1

Introduction à la bibliothèque de classes .NET Framework

Cadre 2.0

Présentation de la bibliothèque de classes .NET Framework

Autres conseils

De nombreuses raisons:

  • uint n'est pas conforme à CLS, il aurait donc été problématique de rendre un type intégré (tableau) dépendant de celui-ci.
  • Le moteur d'exécution tel que conçu à l'origine interdit à tout objet du tas d'occuper plus de 2 Go de mémoire.Étant donné que la taille maximale du tableau qui serait inférieure ou égale à cette limite serait new byte[int.MaxValue], il serait déroutant pour les gens de pouvoir générer des longueurs de tableau positives mais illégales.
  • Historiquement, C# hérite d’une grande partie de sa syntaxe et de ses conventions du C et du C++.Dans ces tableaux, il s'agit simplement d'arithmétique de pointeur, donc une indexation négative des tableaux était possible (bien que normalement illégale et dangereuse).Étant donné qu'une grande partie du code existant suppose que l'index du tableau est signé, cela aurait été un facteur
  • Dans le même ordre d'idées, l'utilisation d'entiers signés pour les index de tableau en C/C++ signifie que l'interopérabilité avec ces langages et fonctions non gérées nécessiterait de toute façon l'utilisation d'entiers dans ces circonstances, ce qui pourrait prêter à confusion en raison de l'incohérence.
  • L'implémentation de BinarySearch (un composant très utile de nombreux algorithmes) repose sur la possibilité d'utiliser la plage négative de l'int pour indiquer que la valeur n'a pas été trouvée. et l'emplacement auquel une telle valeur doit être insérée pour maintenir le tri.
  • Lorsque vous travaillez sur un tableau, il est probable que vous souhaitiez prendre un décalage négatif d'un index existant.Si vous utilisiez un décalage qui vous amènerait au-delà du début du tableau en utilisant l'unité, le comportement de bouclage rendrait votre index éventuellement légal (dans la mesure où il est positif).Avec un int, le résultat serait illégal (mais sûr puisque le runtime empêcherait la lecture de mémoire invalide)

Je pense que cela pourrait aussi avoir à voir avec la simplification des choses à un niveau inférieur, puisque Array.Length sera bien sûr ajouté à un nombre négatif à un moment donné, si Array.Length n'était pas signé et ajouté à un entier négatif (complément à deux) , il pourrait y avoir des résultats désordonnés.

On dirait que personne n’a répondu à « la question ultime ».

Je pense que l'utilisation principale des entiers non signés est de fournir une interface plus facile avec des systèmes externes (P/Invoke et autres) et de couvrir les besoins des différentes langues portées sur .NET.

En règle générale, les valeurs entières sont signées, sauf si vous avez explicitement besoin d'une valeur non signée.C'est juste la façon dont ils sont utilisés.Je ne suis peut-être pas d'accord avec ce choix, mais c'est comme ça.

Pour le moment, avec les contraintes de mémoire typiques d'aujourd'hui, si votre tableau ou structure de données similaire a besoin d'une longueur UInt32, vous devriez envisager d'autres structures de données.

Avec un tableau d'octets, Int32 vous donnera 2 Go de valeurs

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