2012-11-11 26 views
8

Uwaga, nie jestem całkiem pewien, że to pytanie należy do tej strony, ale staram się być konstruktywna.

Dlaczego koduIntPtr na ciąg szesnastkowy w ciągu znaków.Format

IntPtr ptr = new IntPtr(1234); 
Console.WriteLine(string.Format("{0:X8}", ptr)); 
Console.WriteLine(ptr.ToString("X8")); 
Console.WriteLine(string.Format("{0:X8}", ptr.ToInt32())); 

wyjściowego

1234 
000004D2 
000004D2 

Dlaczego nie jest hex formatowanie zastosowane do IntPtr argumentu bezpośrednio, gdy zwróciła się więc formatowania? Czy istnieją jakieś znane argumenty przemawiające przeciwko projektowaniu takiej funkcjonalności?
Jeśli nie ma żadnych argumentów przeciwko takiemu projektowi, to według którego kanału powinienem zgłosić ten problem firmie Microsoft?


Należy również zauważyć, że debugger wyświetla wartość IntPtr w heksagonie, jeśli jest to wymagane.
Uważam, że byłby to dość intuicyjny i stosunkowo częsty sposób drukowania wartości IntPtr. Znalazłem również kod napisany przez innych ludzi, którzy użyli pierwszej linii i oczywiście oczekiwali wyniku heksadecymalnego, ale w rzeczywistości wynik był inny. Zajęło mi to trochę czasu, zanim zauważyłem problem, który skomplikował rozumienie komunikatów logów.

Odpowiedz

2

Dzieje się tak, ponieważ w pierwszym przypadku, ponieważ IntPtr nie jest jednym z wbudowanych typów integralnych, które działają z String.Format, ptr.ToString() jest wywoływany w celu zwrócenia ciągu znaków. Ponieważ formatowanie jest stosowane tylko po konwersji na łańcuch znaków, specyfikator formatu X8 nie działa.