Pregunta

Tener un ayudante de montaje independiente que contiene sólo declaraciones P / Invoke para componentes legado de 3 ª parte, me pregunto cuál de estas dos formas es tanto mejor se ™ si la asamblea debe estar marcado compatible con CLS:

  • Uso Int32 en un público Declaración de P / Invoke cuando la declaración no administrado tiene unsigned int.
  • Uso UInt32 en un interno Declaración de P / Invoke cuando la declaración no administrado tiene unsigned int, y se envuelve en un público método que toma un Int32 y la convierte en UInt32 cuando llamar a la método interno.

¿Cuáles son los arriba y desventajas de estos?

¿Fue útil?

Solución

El contador de referencias P / Invoke no va a quejarse cuando la uint se hace demasiado grande, vas a terminar con un int negativo. La capa adicional hace le permiten utilizar el comprobado de palabras clave para generar una OverflowException. Lo cual es bastante conveniente.

si vale la pena la molestia es una cuestión secundaria. Las porciones de las API de Win32, como, sin firmar utilizan como un lógica restricción. Al igual que la longitud de la cadena o el tamaño de un bloque de memoria, nunca puede ser negativo. En la práctica, un número tal, nunca puede desbordarse. Porque no es posible asignar esta cantidad de memoria. No puedo recordar una vez en funcionamiento una API donde estaba un slam-dunk que uint debe ser utilizado. Como tal, creo que estás bien sólo mediante una declaración PInvoke recta con enteros.

Otros consejos

No creo que se obtendría comportamiento correcto si se fue con la opción 1. Int32 sólo puede ir tan alto como 2147483647. Mientras que la unsigned int sube al 4294967295. Como siempre que se sepa que no es necesario ningún valor por encima de 2 mil millones, que en realidad no importa. Pero para ser técnicamente correcto, la interfaz pública debe exponer un tipo grande y llevar a cabo la comprobación de límites para asegurarse de que encaja en un int sin firmar y lanzar una excepción si no lo hace. Int64 hará (9,223,372,036,854,775,807).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top