如果不告诉我MSDN,有没有人可以给出一个简洁,清晰的解释每一个的目的,以及何时使用它们。(IntPtr、SafeHandle和HandleRef)
发布于 2009-02-09 00:45:25
IntPtr只是一个简单的基于整数的结构,可以保存指针(即32位系统上的32位大小,64位系统上的64位大小)。
SafeHandle是一个用来保存Win32对象句柄的类-它有一个终结器,可以确保在对象被GC时句柄是关闭的。SafeHandle是一个抽象类,因为不同的Win32句柄有不同的关闭方式。在引入SafeHandle之前,IntPtr用于保存Win32句柄,但确保它们被正确关闭并防止被GC是程序员的责任。
HandleRef是一种确保非托管句柄在P/Invoke调用过程中不会被GC调用的方法。如果没有像HandleRef这样的东西,如果托管代码在P/Invoke调用之后没有对句柄做任何事情,如果GC是在P/Invoke调用期间运行的,它将不会意识到句柄仍在使用中,并且可能会对其进行GC。我想象(但我不确定也没有看过) SafeHandle可能会使用HandleRef作为其封装句柄管理的一部分。
发布于 2010-02-18 07:36:50
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);假设这是程序中对"a“的唯一引用,则等同于:
HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);问题是,当"a“被释放时,它将关闭句柄。如果在调用SendMessage之前或调用过程中发生这种情况,句柄将无效。
HandleRef防止"a“在程序使用h结束之前被垃圾回收。
https://stackoverflow.com/questions/526661
复制相似问题