Microsoft C#±àÂë¹æ·¶ ÏÂÔر¾ÎÄ

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.