为什么使用IntPtr处理?

时间:2012-02-07 00:22:45

标签: c# .net winapi c++-cli window-handles

使用PInvoke时,我注意到我们需要使用IntPtr来引用Windows句柄。我想知道为什么不使用int来处理句柄?我对句柄的理解是它只是一个整数值。

4 个答案:

答案 0 :(得分:18)

Windows句柄定义为本机计算机指针大小的整数。这样他们就可以秘密地成为指针,如果他们需要的话。 (句柄可能不是指针,但如果操作系统实现者认为必要,则允许是一个。出于安全原因,它们通常不是指针;它如果它们实际上是指针,那么人们就很容易滥用系统。)

C#中的int定义为32位整数,在64位机器上太小。 IntPtr定义为可以保存机器大小指针的整数。这就是为什么在与句柄互操作时总是使用IntPtr。

答案 1 :(得分:10)

句柄是指针大小的值。

在64位平台上,它们的宽度为8个字节。

答案 2 :(得分:4)

句柄的大小取决于机器架构(32/64位)。 IntPtr会照顾到这一点。

答案 3 :(得分:2)

句柄本质上是系统级指针,指针不会隐式地转换为int。它本身就是一种类型。这就是为什么你在.NET中用IntPtr来表示句柄类型。