是否有必要利用 IntPtr 构造函数将 IntPtr 设置为等于另一个 IntPtr?

Is it necessary to utilize the IntPtr constructor to set an IntPtr to equal another IntPtr?

我目前正在将应用程序重构为 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 的情况,但是由于 ab 都是 IntPtr 类型,我不能只使用 IntPtr b = a; 因为 IntPtr 是值类型吗?我认为这将使我不必在这种情况下检查 64 位或 32 位构建,并且 MSDN 文档似乎没有暗示 IntPtr 构造函数中的任何魔法。

基本上我的问题是为什么我要使用

IntPtr a = Marshal.AllocHGlobal(SomeObjectSize);
IntPtr b = IntPtr(a.ToInt32());

超过

IntPtr a = Marshal.AllocHGlobal(SomeObjectSize);
IntPtr b = a;

?

你不仅可以使用

IntPtr b = a;

保存用于获取指针的信息,但您应该使用它来确保不同平台的兼容性。IntPtr 是平台特定类型(参见 there),其大小取决于平台位数自动适应指针大小。

然而,IntPtr 是多用途类型,它不仅用于保存指针信息,还用于各种 Windows API 句柄,以便在 Win [=24] 中使用=] 互操作(然而,这主要由运行时和 CTS 使用,很少由外部应用程序使用)。许多这些句柄(例如 windows 句柄、图标句柄、文件句柄、注册表句柄等)具有 32 位大小,这就是 IntPtr 应该用特定大小的整数初始化的地方IntPtr(int value) 构造函数开始发挥作用。