e.g. System.IO.FileStream 类型需要打开一个文件(本机资源)并保存文件的句柄,句柄是什么?指针的指针,指针是执行对象的内存地址、但是对象会在内存变动的、所以只是知道对象的地址是可能得到错误的对象,所以使用句柄执行对象的地址,在地址发生改变时,将会更新,并且句柄的地址是不会改变的
GCHandleType具体看注释 – Weak会在终结器调用前清零,即便对象复活,弱引用都会清除 – WeakTrackResurrection和Weak差不多,但是如果对象复活,将不会被清除 – Normal 透明句柄,防止被垃圾回收掉,但是会进行内存压缩 – Pinned和Normal类似,但是不会进行内存压缩,也就是这个对象在内存中无法被移动,破坏垃圾回收效率
//// 摘要:// Represents the types of handles the System.Runtime.InteropServices.GCHandle class// can allocate.publicenumGCHandleType{//// 摘要:// This handle type is used to track an object, but allow it to be collected. When// an object is collected, the contents of the System.Runtime.InteropServices.GCHandle// are zeroed. Weak references are zeroed before the finalizer runs, so even if// the finalizer resurrects the object, the Weak reference is still zeroed.
Weak =0,//// 摘要:// This handle type is similar to System.Runtime.InteropServices.GCHandleType.Weak,// but the handle is not zeroed if the object is resurrected during finalization.
WeakTrackResurrection =1,//// 摘要:// This handle type represents an opaque handle, meaning you cannot resolve the// address of the pinned object through the handle. You can use this type to track// an object and prevent its collection by the garbage collector. This enumeration// member is useful when an unmanaged client holds the only reference, which is// undetectable from the garbage collector, to a managed object.
Normal =2,//// 摘要:// This handle type is similar to System.Runtime.InteropServices.GCHandleType.Normal,// but allows the address of the pinned object to be taken. This prevents the garbage// collector from moving the object and hence undermines the efficiency of the garbage// collector. Use the System.Runtime.InteropServices.GCHandle.Free method to free// the allocated handle as soon as possible.
Pinned =3}