2012-11-11 6 views
8

この質問はこのサイトに属しているとは確信していませんが、私は建設的なものにしようとしています。

なぜコードIntPtrをstring.Formatの16進文字列に変換

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())); 

出力

1234 
000004D2 
000004D2 
フォーマットになるよう要求されたときの六角は、直接 IntPtr引数に適用書式設定されていないのはなぜ

?機能を設計することに関して既知の議論はありますか?
このような設計に対する引数がない場合は、この問題をどのチャネルでマイクロソフトに報告する必要がありますか?


要求された場合、デバッガは16進数でIntPtrの値を表示することにも注意してください。
私はそれが非常に直観的で、比較的頻繁にIntPtrの値を印刷する方法であることがわかりました。私はまた、最初の行を使用し、明らかに16進数の結果を期待した他の人が書いたコードを見つけましたが、実際は結果が異なりました。また、ログメッセージの理解が複雑な問題に気付くまでに、しばらく時間がかかりました。

答えて

2

IntPtrは、String.Formatで動作する組み込み型のいずれでもないため、文字列を返すためにptr.ToString()が呼び出されるためです。書式設定は文字列への変換後にのみ適用されるため、X8書式指定子は効果がありません。

6

String.Format methodが引数の書式文字列を使用するには、引数にIFormattable interfaceを実装する必要があります。

IntPtr typeIFormattableを実装していませんので、String.Format方法は、単に文字列にIntPtr値をオンにするパラメータなしToStringメソッドを呼び出します。

関連する問題