是否有必要利用 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
的情况,但是由于 a
和 b
都是 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)
构造函数开始发挥作用。
我目前正在将应用程序重构为 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
的情况,但是由于 a
和 b
都是 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)
构造函数开始发挥作用。