10

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

4

4 回答 4

18

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

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

于 2012-02-07T00:25:13.607 回答
10

句柄是指针大小的值。

它们在 64 位平台上为 8 字节宽。

于 2012-02-07T00:24:16.210 回答
4

句柄的大小取决于机器架构(32/64 位)。IntPtr会处理的。

于 2012-02-07T00:24:45.983 回答
2

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

于 2012-02-07T00:24:35.400 回答