Domanda

Avere un aiutante separato contenente solo le dichiarazioni di montaggio P / Invoke per eredità 3rd componenti di partito, mi chiedo quale di questi due modi è quello migliore ™ se l'assemblea deve essere contrassegnato compatibile con CLS:

  • Usa Int32 in un pubblico dichiarazione P / Invoke in cui la dichiarazione non gestito ha unsigned int.
  • Usa UInt32 in un dichiarazione interno P / Invoke in cui la dichiarazione non gestito ha unsigned int, e avvolgerlo in un pubblico metodo che accetta un Int32 e lo converte in UInt32 quando chiamando il metodo interno.

Quali sono i lati negativi a monte ea questi?

È stato utile?

Soluzione

Il marshaller P / Invoke non è andare a lamentarsi quando l'uint diventa troppo grande, devi semplicemente finire con un int negativo. Lo strato supplementare fa consentono di utilizzare il controllato parola chiave per generare un OverflowException. Il che è abbastanza desiderabile.

Sia che vale la fatica è una questione secondaria. Un sacco di API, come Win32, usano non firmato come logico vincolo. Come la lunghezza della stringa o la dimensione di un blocco di memoria, non può mai essere negativo. In pratica, tale numero può mai troppo pieno. Poiché non è possibile allocare altrettanta memoria. Non riesco a ricordare in esecuzione una volta in un'API in cui si trattava di una schiacciata che uint dovrebbe essere usato. Come tale, è penso che stai bene solo con una dichiarazione PInvoke dritto con int.

Altri suggerimenti

Non credo che si otterrebbe comportamento corretto se si è andato con l'opzione 1. Int32 non può che andare più in alto 2.147.483.647. Considerando che il unsigned int sale a 4.294.967.295. Finché sai che non è necessario alcun valore al di sopra di 2 miliardi, non ha molta importanza. Ma per essere tecnicamente corretta, l'interfaccia pubblica dovrebbe esporre un tipo più grande ed eseguire il controllo dei limiti per assicurarsi che si adatta in un unsigned int e un'eccezione se non è così. Un Int64 farà (9,223,372,036,854,775,807).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top