109 votes

Pourquoi est-elle Array.Length un int et non un uint

Pourquoi est-elle Array.Length un int et non un uint. Ce qui me dérange (un peu), parce qu’une valeur de longueur peut jamais par la négative.

Cela aussi m’a obligé à utiliser un int pour une propriété de longueur sur ma propre classe, parce que lorsque vous spécifiez une valeur int, cela doit être explicitement cast...

Donc l’ultime question est : est il tout usage pour un unsigned int (uint) ? Même Microsoft ne semble ne pas s’en servir.

68voto

Kev Points 60744
<P>Unsigned int n’est pas conforme CLS et serait donc restreindre l’utilisation de la propriété de ces langues qui implémentent un UInt.</P> <P>Mise à jour : Voir ici :</P> <P>Framework 1.1</P> <P><A href="http://msdn.microsoft.com/en-us/library/hfa3fa08(VS.71).aspx">http://msdn.Microsoft.com/en-US/Library/hfa3fa08 (VS.71).aspx</A></P> <P>Framework 2.0</P> <P><A href="http://msdn.microsoft.com/en-us/library/hfa3fa08(VS.80).aspx">http://msdn.Microsoft.com/en-US/Library/hfa3fa08 (VS.80).aspx</A></P>

60voto

ShuggyCoUk Points 24204

De nombreuses raisons:

  • uint n'est pas conforme CLS, et de faire ainsi un construit dans le type (matrice) à charge, il aurait été problématique
  • Le moteur d'exécution à l'origine conçu interdit tout objet sur le tas occupant plus de 2 go de mémoire. Depuis le maximum de tableau de taille qui serait inférieure ou égale à cette limite serait de nouveau byte[int.MaxValue] il serait déroutant pour les gens à être en mesure de générer positif, mais illégal tableau des longueurs.
  • Historiquement, C# hérite d'une grande partie de sa syntaxe et de la convention de C et de C++. Dans ces tableaux sont tout simplement de l'arithmétique des pointeurs si négatif, tableau d'indexation a été possible (bien que normalement illégal et dangereux). Depuis beaucoup de code existant suppose que le tableau de l'indice est négative, cela aurait été un facteur de
  • Sur une note associée à l'utilisation de nombres entiers signés pour les indices de tableau en C/C++ signifie que l'interopérabilité avec ces langues et des fonctions non managées nécessiterait l'utilisation d'entiers dans ces circonstances, de toute façon, qui peut prêter à confusion en raison de l'incohérence.
  • Le BinarySearch de mise en œuvre (un élément très utile de nombreux algorithmes) s'appuie sur d'être en mesure d'utiliser la plage négative de l'int pour indiquer que la valeur n'a pas été trouvé et l'endroit où cette valeur doit être insérée pour maintenir le tri.
  • Lors de l'utilisation sur un tableau, il est probable que vous voulez prendre un décalage négatif d'un index existant. Si vous avez utilisé un décalage qui vous passé le début du tableau à l'aide de l'unité, puis l'enrouler autour de son comportement pouvait faire de votre index éventuellement juridique (en ce qu'elle est positive). Avec un int le résultat serait illégal (mais en toute sécurité depuis le runtime garde contre la lecture de mémoire non valide)

1voto

Constantin Points 12185

On dirait que personne ne fourni de réponse à la « question ultime ».

Selon moi, l’utilisation principale d’entiers non signés est de fournir plus facilement interfacer avec des systèmes externes (P/Invoke et autres) et pour couvrir les besoins de diverses langues étant portés à .NET.

-2voto

Lasse V. Karlsen Points 148037

En général, les valeurs entières sont signés, sauf si vous devez explicitement une valeur non signée. C’est juste la façon dont ils sont utilisés. Je ne peux pas d’accord avec ce choix, mais c’est juste la façon dont il est.

Pour l’instant, avec des contraintes de mémoire typique todays, si votre tableau ou des données similaires structurent besoins une longueur UInt32, vous devriez envisager d’autres structures de données.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X