79 votes

uint vs int en C#

Je l'ai observé pendant un moment que C#, programmeurs ont tendance à utiliser des int partout, et rarement recours à uint. Mais je n'ai jamais découvert une réponse satisfaisante pour expliquer pourquoi.

Si l'interopérabilité est votre objectif, uint ne devrait pas apparaître en public Api parce que pas tous de la CLI d'appui aux langues des entiers non signés. Mais cela n'explique pas pourquoi int est si répandue, même dans les classes internes. Je soupçonne que c'est la raison pour uint est utilisé avec parcimonie dans la BCL.

En C++, si vous avez un entier pour lequel les valeurs négatives n'ont pas de sens, vous choisissez un entier non signé.

De toute évidence, cela signifie que les nombres négatifs ne sont pas autorisés ou prévu, et le compilateur va faire quelques vérifications pour vous. Je soupçonne aussi dans le cas des indices de tableau, que l'équipe peuvent facilement passer les limites inférieures de la vérifier.

Toutefois, lorsque le mélange int et des types d'unité, de soins et de moulages seront nécessaires.

Devrait uint être utilisé plus? Pourquoi?

75voto

jjnguy Points 62123

int est plus court à taper qu' uint.

48voto

Reed Copsey Points 315315

Votre sens de l'observation de pourquoi uint n'est pas utilisé dans la BCL est la raison principale, je crois.

UInt32 n'est pas Conforme CLS, ce qui signifie qu'il est tout à fait inapproprié pour une utilisation dans les Api publiques. Si vous allez être en utilisant uint dans votre API privée, cela signifie faire des conversions à d'autres types - et il est généralement plus facile et plus sûr de garder le type même.

Je pense aussi que ce n'est pas aussi commun en développement C#, même quand C# est la seule langue utilisée, principalement parce qu'il n'est pas commun dans la BCL. Les développeurs, en général, essayez d' (heureusement) imiter le style du cadre dans lequel ils sont de construction - en C#, ce qui signifie essayer de faire de votre Api, publics et internes, ressembler un peu comme le .NET Framework BCL en tant que possible. Cela signifie en utilisant uint avec parcimonie.

18voto

Virtlink Points 12475

Normalement, int suffit. Si vous pouvez satisfaire à toutes les conditions suivantes, vous pouvez utiliser uint:

  • Ce n'est pas pour une API publique (depuis uint n'est pas conforme CLS).
  • Vous n'avez pas besoin de nombres négatifs.
  • Vous (pourriez) besoin de la variété.
  • Vous êtes de ne pas l'utiliser dans une comparaison avec < 0, qui n'est jamais true.
  • Vous êtes de ne pas l'utiliser dans une comparaison avec >= 0, qui n'est jamais false.

La dernière exigence est souvent oublié et introduire des bogues:

static void Main(string[] args)
{
    if (args.Length == 0) return;
    uint last = (uint)(args.Length - 1);

    // This will eventually throw an IndexOutOfRangeException:
    for (uint i = last; i >= 0; i--)
    {
        Console.WriteLine(args[i]);
    }
}

12voto

Lorenzo Points 2772

1) Mauvaise habitude. Sérieusement. Même en C/C++.

Pensez à la commune pour le modèle:

for( int i=0; i<3; i++ )
    foo(i);

Il n'y a absolument aucune raison d'utiliser un entier. Vous n'aurez jamais des valeurs négatives. Mais presque tout le monde va faire une simple boucle de cette façon, même si elle contient (au moins) deux autres "style" des erreurs.

2) int est perçu comme le type natif de la machine.

4voto

JSBձոգչ Points 25069

Je préfère uint de int moins qu'un nombre négatif est en fait dans la plage de valeurs acceptables. En particulier, l'acceptation d'un int param mais le fait de lancer un ArgumentException si le nombre est inférieur à zéro est juste idiot--utiliser un uint!

Je suis d'accord qu' uint est sous-utilisé, et j'encourage tout le monde à l'utiliser davantage.

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