Question

Avoir une aide contenant l'ensemble des déclarations que P / Invoke distinctes pour les composants de 3e héritage du parti, je me demande laquelle de ces deux façons est le meilleur ™ si l'ensemble doit être conforme CLS marqué:

  • Utilisez Int32 dans un publique Déclaration de P / Invoke où la déclaration a unsigned int non géré.
  • Utilisez UInt32 dans un interne Déclaration de P / Invoke où la déclaration non gérée a unsigned int, et l'envelopper dans une méthode publique qui prend un Int32 et le convertit en UInt32 quand appelant la méthode interne .

Quels sont les haut et les inconvénients de ces?

Était-ce utile?

La solution

Le placier P / Invoke ne va pas se plaindre quand le uint devient trop grand, vous allez finir avec un int négatif. La couche supplémentaire ne vous permet d'utiliser le coché mot-clé pour générer un OverflowException. Ce qui est assez souhaitable.

Que ce soit en valeur la dispute est une question secondaire. Beaucoup d'API, comme Win32, utilisez Unsigned comme logique contrainte. Comme la longueur de la chaîne ou la taille d'un bloc de mémoire, il ne peut jamais être négatif. Dans la pratique, un tel nombre ne peut jamais déborder. Parce qu'il est impossible d'attribuer autant de mémoire. Je ne me souviens pas en cours d'exécution une fois dans une API où il était un slam-dunk qui uint doit être utilisé. En tant que tel, je pense que vous allez bien juste en utilisant une déclaration de PInvoke droite avec ints.

Autres conseils

Je ne pense pas que vous obtiendrez un comportement correct si vous êtes allé avec l'option 1. Int32 ne peut aller aussi haut que 2.147.483.647. Alors que le unsigned int va jusqu'à 4.294.967.295. Tant que vous savez que vous ne avez pas besoin de valeurs supérieures à 2 milliards, il ne compte pas vraiment. Mais pour être techniquement correct, l'interface publique devrait exposer un type plus grand et effectuer la vérification des limites pour vous assurer qu'il convient dans un unsigned int et lancer une exception si elle ne fonctionne pas. Un Int64 fera (9,223,372,036,854,775,807).

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