Page 41
} }
?Ò»¶¨ÇëÔÚÀàÐÍÓ¦¸ÃΪÊÍ·Å·ÇÍйÜ×ÊÔ´¸ºÔð£¬ÇÒ×ÔÉíûÓÐÖÕ½áÆ÷µÄÇé¿öÏ£¬½«¸ÃÀàÐͶ¨ÒåΪ¿ÉÖÕ½áµÄ¡£µ±ÊµÏÖÖÕ½áÆ÷ʱ£¬¼òµ¥µÄµ÷ÓÃDispose£¨false£©£¬²¢½«ËùÓÐ×ÊÔ´ÇåÀíÂß¼·ÅÈë Dispose£¨bool disposing£©·½·¨¡£
// C# sample:
publicclassComplexResourceHolder : IDisposable { ...
~ComplexResourceHolder£¨£© {
Dispose£¨false£©; }
protectedvirtualvoid Dispose£¨bool disposing£© { ... } }
?Ò»¶¨Çë½÷É÷µÄ¶¨Òå¿ÉÖÕ½áÀàÐÍ¡£×Ðϸ¿¼ÂÇÈκÎÒ»¸öÄúÐèÒªÖÕ½áÆ÷µÄÇé¿ö¡£´øÓÐÖÕ½áÆ÷µÄʵÀý´ÓÐÔÄܺ͸´ÔÓÐԽǶÈÀ´Ëµ£¬¶¼Ð踶³ö²»Ð¡µÄ´ú¼Û¡£
?Ò»¶¨ÇëΪÿһ¸ö¿ÉÖÕ½áÀàÐÍʵÏÖ»ù´¡Dispose ģʽ¡£¸ÃģʽµÄϸ½ÚÇë²Î¿¼ÏÈÇ°Õ½ڡ£Õâ¸øÓè¸ÃÀàÐ͵ÄʹÓÃÕßÒÔÒ»ÖÖÏÔʽµÄ·½Ê½È¥ÇåÀíÆäÓµÓеÄ×ÊÔ´¡£
?ÄúÓ¦¸ÃÔÚÖÕ½áÆ÷¼´Ê¹ÃæÁÙÇ¿ÖƵÄÓ¦ÓóÌÐòÓòжÔØ»òÏß³ÌÖÐÖ¹µÄÇé¿öÒ²±ØÐë±»Ö´ÐÐʱ£¬´´½¨²¢Ê¹ÓÃÁÙ½ç¿ÉÖÕ½á¶ÔÏó£¨Ò»¸ö´øÓаüº¬ÁËCriticalFinalizerObjectµÄÀàÐͲã´ÎµÄÀàÐÍ£©¡£
?Ò»¶¨Ç뾡Á¿Ê¹ÓûùÓÚSafeHandle»òSafeHandleZeroOrMinusOneIsInvalid£¨¶ÔÓÚ Win32 ×ÊÔ´¾ä±ú£¬ÆäÖµÈç¹ûΪ0»òÕß-1 £¬Ôò´ú±íÆäΪÎÞЧ¾ä±ú£©µÄ×ÊÔ´·â×°Æ÷£¬¶ø²»ÊÇ×Ô¼ºÀ´±àдÖÕ½áÆ÷¡£ÕâÑù£¬ÎÒÃDZãÎÞÐèÖÕ½áÆ÷£¬·â×°Æ÷»áΪÆä×ÊÔ´ÇåÀí¸ºÔð¡£°²È«¾ä±úʵÏÖÁËIDisposable½Ó¿Ú£¬²¢¼Ì³Ð×ÔCriticalFinalizerObject£¬ËùÒÔ¼´Ê¹ÃæÁÙÇ¿ÖƵÄÓ¦ÓóÌÐòÓòжÔØ»òÏß³ÌÖÐÖ¹£¬ÖÕ½áÆ÷µÄÂß¼Ò²»á±»Ö´ÐС£
? 2016 Microsoft Corporation. All rights reserved.
Page 42
///
/// Represents a wrapper class for a pipe handle. ///
[SecurityCritical£¨SecurityCriticalScope.Everything£©,
HostProtection£¨SecurityAction.LinkDemand, MayLeakOnAbort = true£©, SecurityPermission£¨SecurityAction.LinkDemand, UnmanagedCode = true£©] internalsealedclassSafePipeHandle : SafeHandleZeroOrMinusOneIsInvalid {
private SafePipeHandle£¨£© : base£¨true£© { }
public SafePipeHandle£¨IntPtr preexistingHandle, bool ownsHandle£© : base£¨ownsHandle£© {
base.SetHandle£¨preexistingHandle£©; }
[ReliabilityContract£¨Consistency.WillNotCorruptState, Cer.Success£©, DllImport£¨\, CharSet = CharSet.Auto, SetLastError = true£©] [return: MarshalAs£¨UnmanagedType.Bool£©]
privatestaticexternbool CloseHandle£¨IntPtr handle£©;
protectedoverridebool ReleaseHandle£¨£© {
return CloseHandle£¨base.handle£©; } }
///
/// Represents a wrapper class for a local memory pointer. ///
[SuppressUnmanagedCodeSecurity,
HostProtection£¨SecurityAction.LinkDemand, MayLeakOnAbort = true£©]
internalsealedclassSafeLocalMemHandle : SafeHandleZeroOrMinusOneIsInvalid {
public SafeLocalMemHandle£¨£© : base£¨true£© { }
public SafeLocalMemHandle£¨IntPtr preexistingHandle, bool ownsHandle£© : base£¨ownsHandle£© {
base.SetHandle£¨preexistingHandle£©;
? 2016 Microsoft Corporation. All rights reserved.
Page 43
}
[ReliabilityContract£¨Consistency.WillNotCorruptState, Cer.Success£©, DllImport£¨\, CharSet = CharSet.Auto, SetLastError = true£©] privatestaticexternIntPtr LocalFree£¨IntPtr hMem£©;
protectedoverridebool ReleaseHandle£¨£© {
return£¨LocalFree£¨base.handle£© == IntPtr.Zero£©; } }
?Ò»¶¨²»ÒªÔÚÖÕ½áÆ÷´úÂë·¾¶ÄÚ·ÃÎÊÈκοÉÖÕ½á¶ÔÏó£¬ÒòΪÕâÑù»áÓÐÒ»¸ö¼«´óµÄ·çÏÕ£ºËüÃÇÒѾ±»ÖÕ½áÁË¡£ÀýÈ磬һ¸ö¿ÉÖÕ½á¶ÔÏóA £¬ÆäÓµÓÐÒ»¸öÖ¸ÏòÁíÒ»¸ö¿ÉÖÕ½á¶ÔÏóBµÄ¶ÔÏó£¬ÔÚAµÄÖÕ½áÆ÷ÄÚ²¢²»Äܺܰ²ÐĵÄʹÓÃB£¬·´Ö®ÒàÈ»¡£ÖÕ½áÆ÷ÊDZ»Ëæ»úµ÷Óõġ£
µ«ÊDzÙ×÷²ðÏäµÄÖµÀàÐÍ×Ö¶ÎÊÇ¿ÉÒÔ½ÓÊܵġ£
ͬʱҲÇë×¢Ò⣬ÔÚÓ¦ÓóÌÐòÓòжÔØ»ò½ø³ÌÍ˳öµÄijЩʱ¼äµãÉÏ£¬´æ´¢ÓÚ¾²Ì¬±äÁ¿µÄ¶ÔÏó»á±»»ØÊÕ¡£Èç¹ûEnvironment.HasShutdownStarted·µ»ØTrue£¬Ôò·ÃÎÊÒýÓÃÁËÒ»¸ö¿ÉÖÕ½á¶ÔÏóµÄ¾²Ì¬±äÁ¿£¨»òµ÷ÓÃʹÓÃÁË´æ´¢ÓÚ¾²Ì¬±äÁ¿µÄÖµµÄ¾²Ì¬º¯Êý£©¿ÉÄܻ᲻°²È«¡£
?Ò»¶¨²»Òª´ÓÖÕ½áÆ÷µÄÂß¼ÄÚÅ׳öÒì³££¬³ý·ÇÊÇϵͳÑÏÖعÊÕÏ¡£Èç¹û´ÓÖÕ½áÆ÷ÄÚÅ׳öÒì³££¬CLR¿ÉÄÜ»áÍ£Ö¹Õû¸ö½ø³ÌÀ´×èÖ¹ÆäËûÖÕ½áÆ÷±»Ö´ÐУ¬²¢×èÖ¹×ÊÔ´ÒÔÒ»¸öÊÜ¿ØÖƵķ½Ê½ÊÍ·Å¡£
3.12.4 ÖØд Dispose
Èç¹ûÄú¼Ì³ÐÁËʵÏÖIDisposable½Ó¿ÚµÄ»ùÀ࣬Äú±ØÐëҲʵÏÖIDisposable½Ó¿Ú¡£¼ÇµÃÒªµ÷ÓÃÄú»ùÀàµÄ Dispose£¨bool£©¡£
publicclassDisposableBase : IDisposable {
~DisposableBase£¨£© {
Dispose£¨false£©; }
? 2016 Microsoft Corporation. All rights reserved.
Page 44
publicvoid Dispose£¨£© {
Dispose£¨true£©;
GC.SuppressFinalize£¨this£©; }
protectedvirtualvoidDispose£¨bool disposing£© { // ... } }
publicclassDisposableSubclass : DisposableBase {
protectedoverridevoidDispose£¨bool disposing£© { try {
if£¨disposing£© {
// Clean up managed resources. }
// Clean up native resources. } finally {
base.Dispose£¨disposing£©; } } }
3.12.5 P/Invoke
?Ò»¶¨ÇëÔÚ±àдP/InvokeÇ©Ãûʱ£¬²éÔÄP/Invoke½»»¥²Ù×÷ÖúÀíÒÔ¼°http://pinvoke.net¡£
?Äú¿ÉÒÔʹÓÃIntPtrÀ´½øÐÐÊÖ¶¯·âËÍ´¦Àí¡£ËäÈ»»áÎþÉüÒ×ÓÃÐÔ£¬ÀàÐÍ°²È«ºÍά»¤ÐÔ£¬µ«ÊÇͨ¹ý½«²ÎÊýºÍ×Ö¶ÎÉùÃ÷ΪIntPtr£¬Äú¿ÉÒÔÌáÉýÐÔÄܱíÏÖ¡£ÓÐʱ£¬Í¨¹ýMarshalÀàµÄ·½·¨À´Ö´ÐÐÊÖ¶¯·âËÍ´¦Àí±ÈÒÀÀµÄ¬ÈϽ»»¥²Ù×÷·âËÍ´¦ÀíµÄÐÔÄܸü¸ß¡£¾ÙÀýÀ´Ëµ£¬Èç¹ûÓÐÒ»¸ö×Ö·û´®µÄ´óÊý×éÐèÒª±»´«µÝ¿çÔ½½»»¥²Ù×÷±ß½ç£¬µ«ÊÇÍйܴúÂëÖ»ÐèÆäÖм¸¸öÔªËØ£¬ÄÇôÄú¾Í¿ÉÒÔ½«Êý×éÉùÃ÷ΪIntPtr£¬ÊÖ¶¯µÄ·ÃÎÊËùÐèµÄ¼¸¸öÔªËØ¡£
? 2016 Microsoft Corporation. All rights reserved.