我目前正在将应用程序重构为64位,并且试图了解IntPtr的特定用法。我尝试理解的代码的形式为:
IntPtr a = Marshal.AllocHGlobal(SomeObjectSize); //SomeObjectSize is calculated based on some standard
IntPtr b = IntPtr(a.ToInt32());
现在起初我脸红了,我想我可以将a.ToInt32()
更改为a.ToInt64()
,这在需要int
进入IntPtr
的情况下有效,但是由于{ {1}}和a
都是b
类型,因为IntPtr
是值类型,我不能只使用IntPtr b = a;
吗?我认为这将使我不必在这种情况下检查64位或32位版本,并且MSDN文档似乎并不暗示IntPtr
构造函数中有任何魔术。
基本上我的问题是我为什么要使用
IntPtr
在
IntPtr a = Marshal.AllocHGlobal(SomeObjectSize);
IntPtr b = IntPtr(a.ToInt32());
?
答案 0 :(得分:0)
您不仅可以使用
IntPtr b = a;
保留用于获取指针的信息,但是您应该使用它来确保不同平台的兼容性。IntPtr
是特定于平台的类型(请参见there),其大小取决于平台的位数。自动适应指针大小。
但是,IntPtr
是多用途类型,它不仅用于保留指针信息,而且还用于各种Windows API句柄,以便在Win API互操作中使用(但是,它主要由运行时和CTS以及很少由外部应用程序提供)。这些句柄中的许多句柄(例如Windows句柄,图标句柄,文件句柄,注册表句柄等)具有32位大小,因此IntPtr
应该用特定大小的整数初始化,而{{1 }}构造函数起作用。