IntPtr
wurde immer ein wenig vernachlässigt. Bis .NET 4.0 gab es nicht einmal die Add
/ operator+
und Subtract
/ operator-
.
Jetzt ... Wenn Sie zwei Zeiger vergleichen möchten, müssen Sie sie in long
umwandeln, wenn sie IntPtr
sind, oder in ulong
, wenn sie UIntPtr
sind. Beachten Sie, dass Sie unter Windows nur dann ein UIntPtr
benötigen, wenn Sie ein 32-Bit-Programm mit der Option /3GB
verwenden, da andernfalls ein 32-Bit-Programm nur die unteren 2 GB des Adressraums und für 64-Bit-Programme viel verwenden kann Es werden weniger als 64 Bit Adressraum verwendet ( 48 Bit zu diesem Zeitpunkt).
Klar, wenn Sie Kernel-Programmierung in .NET tun, ändert sich das :-) (Ich jocke hier, ich hoffe :-))
Aus dem Grund, warum IntPtr
gegenüber UIntPtr
bevorzugt wird: Ссылка
Der Typ IntPtr ist CLS-kompatibel, der Typ UIntPtr nicht. In der Common Language Runtime wird nur der IntPtr-Typ verwendet. Der Typ UIntPtr wird hauptsächlich bereitgestellt, um die Architektursymmetrie mit dem Typ IntPtr zu erhalten.
Es gibt einige Sprachen, die nicht zwischen signierten und unsignierten Typen unterscheiden. .NET wollte sie unterstützen.
Erledige einige Tests mit
%Vor%(Ich konnte sogar meinen Grafikadapter abstürzen :-))
%Vor% Ich konnte fast 4 GB Speicher mit einem 32-Bit-Programm (auf einem 64-Bit-Betriebssystem) zuweisen (so hatte ich negative IntPtr
)
Und hier ist es eine Besetzung von IntPtr
bis UIntPtr
Beachten Sie, dass dank der Funktionsweise der Zeichenerweiterung (UIntPtr)(ulong)(long)ptr
nicht einfach ausgeführt werden kann, da sie bei 32 Bits unterbrochen wird.
Beachten Sie jedoch, dass nur wenige Programme & gt; 2 GB auf 32 Bits ... Ссылка