IntPtr转换为string.Format中的十六进制字符串

时间:2012-11-11 14:26:40

标签: c# hex tostring intptr

请注意,我不太确定这个问题属于这个网站,但我尝试建设性的。

为什么代码

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参数?有没有任何已知的论据反对设计功能 - ?
如果没有反对此类设计的论据,那么我应该通过哪个渠道向Microsoft报告此问题?


另请注意,如果需要,调试器会以十六进制显示IntPtr值。 我发现打印IntPtr值非常直观且相对频繁。我也找到了使用第一行的其他人编写的代码,显然期望十六进制结果,但实际上结果是不同的。我也花了一些时间来注意这个问题,这使得理解日志消息变得复杂。

2 个答案:

答案 0 :(得分:7)

对于String.Format method使用参数的格式字符串,参数必须实现IFormattable interface

由于IntPtr type未实现IFormattableString.Format方法只会调用无参数ToString方法将IntPtr值转换为字符串

答案 1 :(得分:2)

这是因为在第一种情况下,由于IntPtr不是使用String.Format的内置整数类型之一,因此调用ptr.ToString()以返回字符串。由于格式化仅在转换为字符串后应用,因此X8格式说明符无效。