IntPtr是平台特定的类型,表示指针或句柄,对于多线程操作是安全的。 C#的IntPtr类型称为“特定于平台的整数类型”,用于窗口句柄等本机资源。 资源的大小取决于所使用的硬件和操作系统,但足够大以包含指向系统的指针。 因此,也可以包括资源的名称。 因此,调用的API函数必须具有类似表单句柄的参数,因此在声明函数时,必须将其显式声明为IntPtr类型。IntPtr类型设计为整数,其大小适合特定平台。 这意味着这种类型的实例在32位硬件和操作系统上为32位,在64位硬件和操作系统上为64位。
IntPtr类型可以在支持指针的语言中使用,也可以作为在支持指针的语言和不支持指针的语言之间引用数据的常用方法。
IntPtr对象也可以用于保留句柄。 例如,IntPtr的实例广泛用于在System.IO.FileStream类中维护文件句柄。
IntPtr类型符合CLS,但不符合UIntPtr类型。 只有IntPtr类型可以在公共语言运行库中使用。 许多UIntPtr类型是为了保持与IntPtr类型在体系结构上的对称性而提供的。
例:
C#程序调用Win32API mciSendString函数来控制磁盘驱动器。 此函数的函数原型如下:
MCIERROR mciSendString (
lpctstr lpsz命令,
lptstr lpsz返回字符串,
uint CCH返回,
手持hwnd呼叫后退
);
首先用C#声明此函数:
[dllimport(winmm.dll ) ]
隐私保护语言mcisendstring (stringa、string b、uint c、IntPtr d );
然后用这种方法调用:
mis end string (setcdaudiodooropen ),空,0,this.Handle );
也可以使用IntPtr.Zero将句柄设置为0。
使用或类型强制转换:
mis end string (setcdaudiodooropen ),null,0,) IntPtr )0);
或者,使用IntPtr构造函数。
intptra=newintptr(2121;
注意:
另一方面,用C#声明Win32API时,请务必按照WinAPI的原型进行声明,不要改变其数据类型;
二、如果不经常使用类型强制转换或构造函数初始化IntPtr类型的变量,程序将变得难以理解,容易发生错误。