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

时间:2019-04-11 16:12:28

标签: c# 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的情况下有效,但是由于{ {1}}和a都是b类型,因为IntPtr是值类型,我不能只使用IntPtr b = a;吗?我认为这将使我不必在这种情况下检查64位或32位版本,并且MSDN文档似乎并不暗示IntPtr构造函数中有任何魔术。

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

IntPtr

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

1 个答案:

答案 0 :(得分:0)

您不仅可以使用

IntPtr b = a;

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

但是,IntPtr是多用途类型,它不仅用于保留指针信息,而且还用于各种Windows API句柄,以便在Win API互操作中使用(但是,它主要由运行时和CTS以及很少由外部应用程序提供)。这些句柄中的许多句柄(例如Windows句柄,图标句柄,文件句柄,注册表句柄等)具有32位大小,因此IntPtr应该用特定大小的整数初始化,而{{1 }}构造函数起作用。

相关问题