1.什么是句柄?
在Windows编程中,应用程序需要访问各种资源,如文件、网络、窗口、图标以及线程等。这些不同类型的资源被系统封装成不同的数据结构,当需要使用这些资源时,程序会根据这些数据结构创建出不同的对象,当操作完毕且不在需要这些对象时,程序应当及时对这些对象进行释放。
通常在进行.NET编程时,在得益于有效的内存管理机制,对象的创建和使用比较方便,无须关心对象的创建和内存的分配细节,当不在使用对象时,垃圾回收器会进行回收。由于.NET类库对系统底层对象进行了封装,不在需要调用Windows API对非托管对象进行操作。虽然不直接对非托管对象进行操作,但是程序会间接性的创建这些对象。如果不了解.NET对象与非托管资源之间的关系,在应用程序中很有可能因不恰当的使用这些托管对象,从而导致非托管资源的泄露。
在Windows中,应用程序不能在内存中直接操作被系统封装的对象,而是通过一系列的Windows API中的对象管理器(object manager)来创建、访问、跟踪和销毁这些对象。当应用程序调用API创建对象时,这些对象并不直接返回指向对象的指针,而是会返回一个32位或者64位的整数值,这个在进程或系统范围内的唯一整数值就是句柄。当程序再次访问对象或删除对象时,会将句柄作为Windows API参数来间接对这些对象进行操作,在这个过程中,句柄作为系统对象的标识来使用。
什么是对象管理器(object manager)?
上述中提到的对象管理器,是系统用来统一管理所有Windows内部对象的系统组件。这里所说的内部对象,不同于面向对象编程中“对象”的概念,而是由Windows内核或各个组件的实现和使用的对象。这些对象和结构,不对用户公开或者只能使用句柄由封装好的Windows API进行操作。
在C#编程中,在大多数情况下并不需要与这些Windows API进行交互,因为.NET类库对这些API又进行了封装,但是托管程序仍然会间接的创建出很多Windows内部对象,并持有它们的句柄。
总的来说,句柄是一个32位或64位的整数值(取决于操作系统),所以在32位系统中,C#完全可以用int来表示一个句柄。但.NET提供了一个结构体System.IntPtr专门用来代表句柄或指针,在需要表示句柄或者要在unsafe代码中使用指针时,应当使用IntPtr类型。
本文介绍了Windows编程中句柄的概念及其作用,解释了句柄如何作为唯一标识符用于访问和管理系统对象,同时探讨了.NET环境下句柄的使用。
2009

被折叠的 条评论
为什么被折叠?



