2009-08-24 10 views
10

Esto debería ser simple: veo en todas partes que la gente usa IntPtr, ¿hay alguna razón por la que deba usar UIntPtr?IntPtr vs UIntPtr

+0

Guau, ni siquiera sabía que había un 'UIntPtr'. ¿Podemos nominarlo para la característica más inútil de '.NET'? – ja72

Respuesta

8

Parece que no hay una buena razón para hacerlo. A partir de los documentos:

Observaciones

...

El tipo IntPtr es compatible con CLS, mientras que el tipo UIntPtr no lo es. Solo el tipo IntPtr se utiliza en el lenguaje común runtime. El tipo UIntPtr es proporcionado principalmente para mantener la simetría arquitectónica con el tipo IntPtr .

+1

Esta respuesta está marcada como correcta y incorrecta. – xamid

7

El pozo according to MicrosoftUIntPtr se proporciona principalmente para la simetría arquitectónica. Otro punto interesante es que UIntPtr no cumple con CLS.

En la superficie parecería que IntPtr es la opción preferida. Sin embargo, si sabes que harás una aritmética de puntero, entonces UIntPtr puede ser una mejor opción, ya que en la improvisación había algún oscuro problema al tratar con valores negativos.

1

Hay una gran diferencia ... Por ejemplo, el nuevo UIntPtr(0xC01E0001) da como resultado un puntero al 3223191553, pero IntPtr(0xC01E0001) da como resultado una excepción System.OverflowException: "La operación aritmética provocó un desbordamiento". Es decir, porque 0xC01E0001 es mayor que MaxValue für Int32.

Así que si uno quiere todavía un puntero tal, un entero negativo tiene que ser utilizado como valor interno para IntPtr, como

unchecked((IntPtr)(int)0xC01E0001) 

Para responder a su pregunta: Para valores superiores a Int32.MaxValue es más fácil y de alguna manera más limpio para usar UIntPtr. Probablemente sea siempre la mejor solución, ya que los punteros siempre se consideran sin signo.

+0

No se puede reproducir OverflowException con 'var p1 = new IntPtr (0xC01E0001); var p2 = (IntPtr) 0xC01E0001; ' –

Cuestiones relacionadas