Das sollte einfach sein: Ich sehe überall Leute IntPtr
verwenden, gibt es einen Grund, warum ich stattdessen UIntPtr
verwenden sollte?IntPtr vs UIntPtr
Antwort
Es scheint nicht, als gäbe es einen guten Grund zu. Aus der Dokumentation:
Bemerkungen
...
Der IntPtr-Typ CLS-kompatibel, während des UIntPtr Typ nicht ist. Nur Der IntPtr-Typ wird in der allgemeinen Sprachlaufzeit verwendet. Der UIntPtr-Typ ist , der hauptsächlich bereitgestellt wird, um Architektursymmetrie mit dem Typ IntPtr beizubehalten.
Diese Antwort wird als falsch markiert. – xamid
Nun according to MicrosoftUIntPtr
wird hauptsächlich für architektonische Symmetrie zur Verfügung gestellt. Ein weiterer interessanter Punkt ist, dass UIntPtr
nicht CLS-konform ist.
Auf der Oberfläche scheint IntPtr die bevorzugte Option zu sein. Wenn Sie jedoch wissen, dass Sie Zeigerarithmetik ausführen werden, dann könnte UIntPtr eine bessere Wahl sein, da es in der Off-Chance ein obskures Problem mit negativen Werten gab.
Es gibt einen großen Unterschied .. Zum Beispiel neue UIntPtr(0xC01E0001)
ergibt einen Zeiger bei 3223191553, aber IntPtr(0xC01E0001)
führt zu einer System.OverflowException: "Arithmetische Operation führte zu einem Überlauf". Das heißt, 0xC01E0001 ist größer als MaxValue für Int32.
Also, wenn man noch einen solchen Zeiger will, eine negative ganze Zahl muss für IntPtr als interne Wert verwendet werden soll, wie
unchecked((IntPtr)(int)0xC01E0001)
Um Ihre Frage zu beantworten: Für Werte größer als Int32.MaxValue es ist einfacher und irgendwie sauberer UIntPtr zu verwenden. Es ist wahrscheinlich immer die beste Lösung, da Zeiger immer als vorzeichenlos gelten.
OverflowException kann nicht reproduziert werden nach 'var p1 = new IntPtr (0xC01E0001); var p2 = (IntPtr) 0xC01E0001; ' –
- 1. neue IntPtr (0) vs. IntPtr.Zero
- 2. Wie kann ein UIntPtr-Objekt in C# in IntPtr konvertiert werden?
- 3. Kopiere Daten von IntPtr nach IntPtr
- 4. Int vs IntPtr, wenn Sie einen Griff haben?
- 5. Wie IntPtr konvertieren
- 6. IntPtr immer Null C#
- 7. Offset zu IntPtr hinzufügen
- 8. IntPtr gegen neue
- 9. IntPtr, SafeHandle und HandleRef - Erklärt
- 10. Wie IntPtr zu InteropService.SafeHandle konvertieren?
- 11. Resharper Warnung Casting Enum zu UIntPtr, aber keine Compiler-Warnung
- 12. C# Process.MainWindowHandle gibt immer IntPtr Null
- 13. Wie ein IntPtr zurück in ein Objekt
- 14. Konvertieren von HWND zu IntPtr (CLI)
- 15. Konvertieren Array von Strukturen zu IntPtr
- 16. Convert IntPtr zu int * in C#?
- 17. Wie bekomme ich IntPtr zu einer Struktur?
- 18. Konvertieren eines IntPtr-Fensterhandles in IWin32Window^
- 19. Wie IntPtr zwischen Prozess/Anwendungen übergeben werden
- 20. Wie man IntPtr zu Byte umwandelt *
- 21. Kann ich SafeHandle anstelle von IntPtr verwenden?
- 22. Warum benötigt IntPtr nicht das unsichere Schlüsselwort?
- 23. Marshalling CodeElements zu einem IntPtr in C#
- 24. Intptr Handle sind nicht Garbage Collected
- 25. Need IntPtr für ein Formular (VB.Net)
- 26. IntPtr in hexadezimale Zeichenfolge in string.Format
- 27. Wie IntPtr/Int in Socket konvertieren?
- 28. System :: IntPtr in int * in C++/CLI
- 29. C#, Standard-Parameterwert für ein IntPtr
- 30. SendMessage vs. WndProc
Wow, ich wusste nicht einmal, dass es ein 'UIntPtr' gibt. Können wir es für die nutzloseste Eigenschaft von '.NET' nominieren? – ja72