Szukałem na P/Invoke deklarację RegOpenKeyEx
gdy zauważyłem ten komentarz na stronie:Różnica między IntPtr i UIntPtr
Zmieniono
IntPtr
doUIntPtr
: podczas wywoływania zIntPtr
dla uchwytów, można uruchomić w Overflow.UIntPtr
to właściwy wybór, jeśli chcesz, aby działał poprawnie na platformach 32- i 64-bitowych.
To nie ma sensu do mnie: zarówno IntPtr
i UIntPtr
mają reprezentować wskazówek więc ich wielkość powinna odpowiadać bitness systemu operacyjnego - albo 32 bity lub 64 bity. Ponieważ nie są to liczby, ale wskaźniki, ich podpisane wartości liczbowe nie powinny mieć znaczenia, tylko bity, które reprezentują adres, na który wskazują. Nie mogę wymyślić żadnego powodu, dla którego byłoby różnica między tymi dwoma, ale ten komentarz sprawił, że jestem niepewny.
Czy istnieje konkretny powód używania UIntPtr
zamiast IntPtr
? Według documentation:
typu
IntPtr
CLS jest zgodny, a typUIntPtr
nie. W środowisku wykonawczym wspólnego języka używany jest tylko typIntPtr
. TypUIntPtr
jest dostarczany głównie w celu zachowania symetrii architektury z typemIntPtr
.
To oczywiście oznacza, że nie ma różnicy (o ile ktoś nie próbuje przekonwertować wartości na liczby całkowite). Czy powyższy komentarz z serwisu pinvoke.net jest nieprawidłowy?
Edit:
Po przeczytaniu
MarkH's answer, zrobiłem trochę sprawdzenia i okazało się, że aplikacje .NET nie są duże adres świadomy i może obsługiwać tylko 2 GB wirtualnej przestrzeni adresowej, gdy skompilowany w wersji 32-bitowej tryb. (Można użyć flagi
hack, aby włączyć flagę dużego adresu, ale odpowiedź MarkH pokazuje, że kontrole w .NET Framework będą powodować błędy, ponieważ zakłada się, że przestrzeń adresowa ma tylko 2 GB, a nie 3 GB.)
Oznacza to, że wszystkie poprawne adresy pamięci wirtualnej, które może posiadać wskaźnik (w odniesieniu do .NET Framework) będą między 0x00000000 i 0x7FFFFFFF. Gdy ten zakres zostanie przetłumaczony na podpisany
int
, żadne wartości nie będą ujemne, ponieważ najwyższy bit nie jest ustawiony. To wzmacnia moje przekonanie, że nie ma żadnej różnicy w używaniu IntPtr vs UIntPtr. Czy moje rozumowanie jest poprawne?
Fermat2357 zaznaczył, że powyższa edycja jest nieprawidłowa.
Zobacz również tutaj. http://stackoverflow.com/questions/1320296/intptr-vs-uintptr –
@ Fermat2357 Tak, to było pytanie, które spowodowało, że napisałem nowe pytanie. – xxbbcc
Myślę, że masz rację. Nie ma żadnej różnicy. "UCHWYT" jest po prostu unikalnym numerem dla zasobu (oczywiście w Win32 jest często implementowany jako wskaźnik 32-bitowy do obszaru pamięci).Jednakże 'IntPtr' jest w stanie osadzić dowolny 32-bitowy numer. Różnica w stosunku do UIntPtr to tylko interpretacja tego numeru nic więcej. –