请注意,我不太确定这个问题属于这个网站,但我尝试建设性的。
为什么代码
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
值非常直观且相对频繁。我也找到了使用第一行的其他人编写的代码,显然期望十六进制结果,但实际上结果是不同的。我也花了一些时间来注意这个问题,这使得理解日志消息变得复杂。
答案 0 :(得分:7)
对于String.Format
method使用参数的格式字符串,参数必须实现IFormattable
interface。
由于IntPtr
type未实现IFormattable
,String.Format
方法只会调用无参数ToString
方法将IntPtr
值转换为字符串
答案 1 :(得分:2)
这是因为在第一种情况下,由于IntPtr
不是使用String.Format的内置整数类型之一,因此调用ptr.ToString()
以返回字符串。由于格式化仅在转换为字符串后应用,因此X8格式说明符无效。