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
Respuesta
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 .
Esta respuesta está marcada como correcta y incorrecta. – xamid
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.
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.
No se puede reproducir OverflowException con 'var p1 = new IntPtr (0xC01E0001); var p2 = (IntPtr) 0xC01E0001; ' –
- 1. C# punteros vs IntPtr
- 2. IntPtr vs ref C#
- 3. nueva IntPtr (0) vs. IntPtr.Zero
- 4. ¿Cómo se puede convertir un objeto UIntPtr a IntPtr en C#?
- 5. int vs IntPtr cuando tiene un controlador?
- 6. ¿Qué es intptr?
- 7. C# Convertir IntPtr en int
- 8. IntPtr, SafeHandle y HandleRef - Explicación
- 9. Cómo liberar IntPtr en C#?
- 10. Cómo convertir IntPtr en byte *
- 11. ¿Qué son las asas? IntPtr
- 12. ¿Puedo usar SafeHandle en lugar de IntPtr?
- 13. IntPtr de matriz de bytes y Back
- 14. ¿Por qué usar IntPtr para manejarlo?
- 15. Marshal.AllocHGlobal VS Marshal.AllocCoTaskMem, Marshal.SizeOf VS sizeof()
- 16. Cómo convertir IntPtr al objeto nativo de C++
- 17. ¿Es posible obtener un IntPtr desde una matriz int []?
- 18. hacen IntPtr en C# .NET punto de valor de cadena
- 19. No se puede agregar un IntPtr y un Int
- 20. Obtener Window handle (IntPtr) de Selenium webdriver ventana actual GUID
- 21. C# desasignar memoria a la que hace referencia IntPtr
- 22. Convierta un identificador de ventana IntPtr a IWin32Window^
- 23. SendMessage vs. WndProc
- 24. Marshal.PtrToStringUni() vs new String()?
- 25. ¿Por qué SafeHandle.DangerousGetHandle() es "peligroso"?
- 26. ¿Cómo puedo convertir un tipo IntPtr no administrado en una cadena C#?
- 27. ¿Se puede convertir IntPtr en una matriz de bytes sin hacer un Marshal.Copy?
- 28. ¿por qué no es posible comparar IntPtr.Zero y por defecto (IntPtr)?
- 29. El parámetro es incorrecto. en MS.Internal.XcpImports.MethodEx (IntPtr ptr, String name, CValue [] cvData)
- 30. ¿Deshabilitar hyperthreading vs. cambiar ProcessorAffinity?
Guau, ni siquiera sabía que había un 'UIntPtr'. ¿Podemos nominarlo para la característica más inútil de '.NET'? – ja72