ä»ã®äººã®ã³ãŒããèªãã§ãªãã¡ã¯ã¿ãªã³ã°ããŠããéã®èšäºã®èè ã®èã
.NETãã©ãããã©ãŒã ãèªåã¡ã¢ãªç®¡çããµããŒãããŠããããšã¯åšç¥ã®äºå®ã§ãã ã€ãŸãã æ°ããããŒã¯ãŒãã䜿çšããŠãªããžã§ã¯ããäœæããå Žåãèªåã§ãªããžã§ã¯ãã解æŸããå¿ èŠã¯ãããŸããã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãªããžã§ã¯ãã®ãå°éå¯èœæ§ããå€æãããªããžã§ã¯ããžã®ã«ãŒããªã³ã¯ããªãå Žåã¯è§£æŸãããŸãã ãã ãããœã±ãããã¢ã³ãããŒãžãã¡ã¢ãªãããã¡ãŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã èšè¿°åãªã©ã®ãªãœãŒã¹ã«ãªããšããã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯å šäœçã«æãæŽãããã®ãããªãªãœãŒã¹ã§ã®äœæ¥ã«é¢ããå šäœçãªã¹ãããã¯éçºè ã®è©ã«èœã¡ãŸãã
ãããããã¡ã€ãã©ã€ã¶ã«ã€ããŠã¯ã©ãã§ããïŒ -ããªããå°ããŸãã ãããããã§ãããã¡ã€ãã©ã€ã¶ãŒã¯æ¬åœã«ãªãœãŒã¹ã解æŸããããã«èšèšãããŠããŸãããåé¡ã¯åŒã³åºãã®æéã決å®ãããŠããªãããšã§ããã€ãŸãããã€åŒã³åºããããããŸãã¯åŒã³åºããããã©ããã¯èª°ã«ãããããŸããã ãŸãããã¡ã€ãã©ã€ã¶ãåŒã³åºãé åºã¯å®çŸ©ãããŠããŸããããããã£ãŠããã¡ã€ãã©ã€ã¶ãåŒã³åºããšãã«ããªããžã§ã¯ãã®äžéšããã§ã«ãç Žæ£ããããŠããå¯èœæ§ããããŸãã äžè¬ã«ããã¡ã€ãã©ã€ã¶ãŒ-å®éã«ã¯ããã§ãããããã¯ããå®å šãªããŒãã®ãããªãã®ã§ããããªãœãŒã¹ã管çããéåžžã®æ段ã§ã¯ãããŸããã
ã€ãã£ãªã RAII
C ++ã§ã¯ãã¹ããŒããã€ã³ã¿ãŒä»¥å€ã«èªåã¡ã¢ãªç®¡ççšã®çµã¿èŸŒã¿ããŒã«ããªãããããªãœãŒã¹ïŒ*ïŒã®ã¿ã€ã ãªãŒãªãªãªãŒã¹ã«ãã¿ãŒã³ïŒãŸãã¯ã€ãã£ãªã ïŒãç©æ¥µçã«äœ¿çšãããŠããŸãã ãã®ã€ãã£ãªã ã¯ãResource Acquisition Is InitializationãïŒRAIIïŒãšåŒã°ãã次ã®ãšããã§ãã ãªãœãŒã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã£ããã£ãŒããããã¹ãã©ã¯ã¿ã§è§£æŸãããŸãããã¹ãã©ã¯ã¿ã¯èªåçã«åŒã³åºãããããããªãœãŒã¹ã管çããããã®è¿œå ã®äœæ¥ã¯å¿ èŠãããŸããã
決å®è«çãªãªãœãŒã¹ç®¡çã®åãèãæ¹ãã IDisposableã€ã³ã¿ãŒãã§ã€ã¹ïŒCïŒïŒããã³disposeã¡ãœããïŒJavaïŒã®åœ¢åŒã§ã.NETãŸãã¯JavaïŒ**ïŒãªã©ã®ä»ã®ãã¹ããŒããããã³ã管çãç°å¢ã«ã転éãããããšã¯é©ãããšã§ã¯ãããŸããã ãããããããã®ç°å¢ã¯å€ãC ++ãããã¹ããŒãã§ãããã¡ã¢ãªç®¡çã«é¢é£ããäž»ãªåé¡ã解決ãããŠããããããã®ã€ãã£ãªã ã¯ããŸãããŸãåããŸããã§ããã ããããç§ãæ£ããç解ããéåžžã«ããŸã移åããŸãããããã®ããã«usingãããã¯ïŒCïŒèšèªã®å ŽåïŒãŸãã¯try - with - resources ã¹ããŒãã¡ã³ã ïŒJava 7ã®å ŽåïŒã䜿çšããå¿ èŠããããŸãããªãœãŒã¹ã®ãªãªãŒã¹ã®çè·¡ã¯ãããŸããã
// using
using ( FileStream file = File .OpenRead( "foo.txt" ))
{
//
if (someCondition) return ;
// using
}
// , - using?
FileStream file2 = File .OpenRead( "foo.txt" );
* This source code was highlighted with Source Code Highlighter .
ãã ããããã.NETã®ãªãœãŒã¹ãæäœãããšãã«çºçããå¯äžã®åé¡ã§ã¯ãããŸããã ããã«ãããããã«ããªãœãŒã¹ã解æŸããããã«éåžžã®æ¹æ³ã䜿çšãããšãããã€ãã®ä»ã®åé¡ããããŸãã Disposeã¡ãœããã¯ãªãœãŒã¹ã解æŸããããããã¡ã€ãã©ã€ã¶ãŒåŒã³åºãã¯äžèŠã«ãªãããã£ã³ã»ã«ããå¿ èŠããããŸããããã«ã Disposeã¡ãœããã¯ã¯ã©ã¹äžå€åŒãç Žæ£ããŸããããã«ããããŠãŒã¶ãŒã¯ç Žæ£ãŸãã¯éšåçã«ç Žæ£ããããªããžã§ã¯ããååŸã§ããŸãã ãŸããããã«ã¯ã Disposeã¡ãœãããšã¯ã©ã¹ã®ãã¹ãŠã®ãããªãã¯ã¡ãœããã®äž¡æ¹ã§è¿œå ã®ãã§ãã¯ãå¿ èŠã§ãã
ããã¯ãã¹ãŠãæ¯èŒçåçŽãªã€ãã£ãªã RAIIã.NETãã©ãããã©ãŒã äžã§ãç Žæ£ãã¿ãŒã³ããšåŒã°ãããã¿ãŒã³ã«æµåºãããšããäºå®ã«ã€ãªãããŸããã ãã ãããã®æ€èšã«ç§»ãåã«ã.NETãã©ãããã©ãŒã ã«ååšãã2çš®é¡ã®ãªãœãŒã¹ïŒç®¡ç察象ãªãœãŒã¹ãšé管ç察象ãªãœãŒã¹ïŒãèŠãŠã¿ãŸãããã
管ç察象ããã³ç®¡ç察象å€ã®ãªãœãŒã¹
.NETã«ã¯ã管ç察象ãªãœãŒã¹ãšç®¡ç察象å€ãªãœãŒã¹ã®2çš®é¡ã®ãªãœãŒã¹ããããŸãã ãããŠãããããåºå¥ããããšã¯éåžžã«ç°¡åã§ããã¢ã³ãããŒãžãªãœãŒã¹ã«ã¯ã IntPtr ãçã®ãœã±ããèšè¿°åãªã©ã®ãçã®ããªãœãŒã¹ã®ã¿ãå«ãŸããŸãã RAIIã€ãã£ãªã ã䜿çšããŠããã®ãªãœãŒã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ååŸããŠDisposeã¡ãœããã§è§£æŸãããªããžã§ã¯ãã«ããã±ãŒãžåãããå Žåããã®ãããªãªãœãŒã¹ã¯æ¢ã«ç®¡çãããŠããŸãã å®éããããŒãžãªãœãŒã¹ã¯ã¢ã³ãããŒãžãªãœãŒã¹ã®ãã¹ããŒãã·ã§ã«ãã§ãããç¬åµçãªé¢æ°ãåŒã³åºãå¿ èŠã¯ãªãã IDisposableã€ã³ã¿ãŒãã§ã€ã¹ã®Disposeã¡ãœãããåŒã³åºãå¿ èŠããããªãªãŒã¹ã§ãã
class NativeResourceWrapper : IDisposable
{
// IntPtr â
private IntPtr nativeResourceHandle;
public NativeResourceWrapper()
{
// «»
nativeResourceHandle = AcquireNativeResource();
}
public void Dispose()
{
// , , -
//
ReleaseNativeResource(nativeResourceHandle);
}
// ,
~NativeResourceWrapper() {...}
}
* This source code was highlighted with Source Code Highlighter .
ãããã£ãŠãä»»æã®ãªããžã§ã¯ãã¯ã2ã€ã®ã¿ã€ãã®ãªãœãŒã¹ãææã§ããŸããã¢ã³ãããŒãžãªãœãŒã¹ïŒ IntPtrãªã© ïŒãçŽæ¥å«ãããããããŒãžãªãœãŒã¹ïŒ NativeResourceWrapperãªã© ïŒãžã®ãªã³ã¯ãå«ããããšãã§ããŸããã©ã¡ãã®å Žåãããããã®ãªãœãŒã¹ã®1ã€ãå«ããªããžã§ã¯ãããèªäœã管ç察象ãªãœãŒã¹ã«ãªããŸãã ããã¯ããŸãåºæ¬çã§ã¯ãªãããã«æãããããããŸãããã2ã€ã®ã¿ã€ãã®ãªãœãŒã¹ã®éããç解ããããšã¯éåžžã«éèŠã§ãã
ãã¿ãŒã³ãç Žæ£
ãããã£ãŠããªããžã§ã¯ãã¯2çš®é¡ã®ãªãœãŒã¹ã管çã§ããããšãããã£ãŠããŸãã 管ç察象ãªãœãŒã¹ãšç®¡ç 察象å€ãªãœãŒã¹ã§ãã ãªãœãŒã¹ã解æŸãã2ã€ã®æ¹æ³ããããšããäºå®ã ãã§ãªãã Disposeã¡ãœããã䜿çšãã決å®è«çææ³ãšãã¡ã€ãã©ã€ã¶ãŒã䜿çšããéæ±ºå® è«çææ³ïŒ***ïŒããããŸãã ããŠããã®ãã¹ãŠã®è¯ããã®ãšäžç·ã«æ®ããæ¹æ³ããããŠæãéèŠãªããšã«ã¯ããã®è¯ããã®ã解æŸããæ¹æ³ãèŠãŠã¿ãŸãããã
Disposeãã¿ãŒã³ã®ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ãããªãœãŒã¹ã解æŸããããžãã¯å šäœãå¥ã®ã¡ãœããã«å ¥ããŸããããDisposeã¡ãœãããšãã¡ã€ãã©ã€ã¶ã®äž¡æ¹ããåŒã³åºããŸããäžæ¹ããã®ã¡ãœãããåŒã³åºãããŠãŒã¶ãŒãç¥ããããã©ã°ãè¿œå ããŸãã ãã®åçŽãªã¢ã€ãã¢ã«ã¯ããªãå€ãã®è©³çŽ°ãå«ãŸããŠããããããã€ã³ãããšã«Disposeãã¿ãŒã³ãæ瀺ããŸãããã
1.ãããŒãžãªãœãŒã¹ãŸãã¯ã¢ã³ãããŒãžãªãœãŒã¹ãå«ãã¯ã©ã¹ã¯ã IDisposableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸã
class Boo : IDisposable { ... }
* This source code was highlighted with Source Code Highlighter .
2.ã¯ã©ã¹ã«ã¯ããªãœãŒã¹ã解æŸãããã¹ãŠã®äœæ¥ãè¡ãDispose ïŒ bool disposing ïŒã¡ãœãããå«ãŸããŠããŸãã disposingãã©ã¡ãŒã¿ãŒã¯ããã®ã¡ãœãããDisposeã¡ãœããããåŒã³åºããããããã¡ã€ãã©ã€ã¶ãŒããåŒã³åºããããã瀺ããŸãã ãã®ã¡ãœããã¯ãéå¯éã¯ã©ã¹ã®å Žå㯠仮æ³ã§ãå¯éã¯ã©ã¹ã®å Žåã¯ãã©ã€ããŒãã§ä¿è·ããå¿ èŠããããŸã
// -sealed
protected virtual void Dispose( bool disposing) {}
// sealed
private void Dispose( bool disposing) {}
* This source code was highlighted with Source Code Highlighter .
3. Disposeã¡ãœããã¯åžžã«æ¬¡ã®ããã«å®è£ ãããŸãããŸãã Dispose ïŒ true ïŒã¡ãœãããåŒã³åºããã次ã«GCã¡ãœããåŒã³åºããç¶ããŸãã SuppressFinalize ïŒïŒ ããã¡ã€ãã©ã€ã¶ãåŒã³åºãããªãããã«ããŸãã
public void Dispose()
{
Dispose( true /*called by user directly*/ );
GC.SuppressFinalize( this );
}
* This source code was highlighted with Source Code Highlighter .
GCã¡ãœããã SuppressFinalize ïŒïŒã¯ã Dispose ïŒ true ïŒã¡ãœãããäŸå€ã§ãèœã¡ããå Žåããã¡ã€ãã©ã€ã¶ããã£ã³ã»ã«ãããªãããããŸãDispose ïŒ true ïŒãåŒã³åºããåŸã«åŒã³åºãå¿ èŠããããŸãã 第äºã«ã GC ã ãã¡ã€ãã©ã€ã¶ã¯ãã®åå«ã«è¡šç€ºãããå¯èœæ§ãããããããã¡ã€ãã©ã€ã¶ãå«ãŸãªãã¯ã©ã¹ã§ãSuppressFinalize ïŒïŒãåŒã³åºãå¿ èŠããããŸãïŒã€ãŸãããã¹ãŠã®éå¯éã¯ã©ã¹ã§GCãSuppressFinalize ïŒïŒã¡ãœãããåŒã³åºãå¿ èŠããããŸãïŒã
4. Dispose ïŒ bool disposing ïŒ ã¡ãœããã«ã¯2ã€ã®éšåãå«ãŸããŸããïŒ1ïŒãã®ã¡ãœãããDisposeã¡ãœããããåŒã³åºãããå ŽåïŒã€ãŸãã disposingãã©ã¡ãŒã¿ãŒãtrueã®å Žå ïŒããããŒãžãªãœãŒã¹ãšã¢ã³ãããŒãžãªãœãŒã¹ã解æŸããïŒ2ïŒã¡ãœããããã¡ã€ãã©ã€ã¶ããåŒã³åºãããå Žåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ disposingãã©ã¡ãŒã¿ãŒãfalse ïŒãã¢ã³ãããŒãžãªãœãŒã¹ã®ã¿ã解æŸããŸãã
void Dispose( bool disposing)
{
if (disposing)
{
//
}
//
}
* This source code was highlighted with Source Code Highlighter .
5.ïŒãªãã·ã§ã³ïŒã¯ã©ã¹ã«ã¯ãã¡ã€ãã©ã€ã¶ãå«ããããšãã§ãããã©ã¡ãŒã¿ãšããŠfalseãæž¡ããŠDispose ïŒ bool disposing ïŒãåŒã³åºãããšãã§ããŸãã
~Boo()
{
Dispose( false /*not called by user directly*/ );
}
* This source code was highlighted with Source Code Highlighter .
ãã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãäŸå€ãã¹ããŒããå Žåãéšåçã«æ§ç¯ããããªããžã§ã¯ãã«å¯ŸããŠããã¡ã€ãã©ã€ã¶ãŒãåŒã³åºãããšãã§ããããšãå¿ããªãã§ãã ããã ãã®ãããã¢ã³ãããŒãžãªãœãŒã¹ã¯ãªãŒã³ã¢ããã³ãŒãã§ã¯ããªãœãŒã¹ããŸã ãã£ããã£ãããŠããªãããšãèæ ®ããå¿ èŠããããŸãïŒ****ïŒã
6.ïŒãªãã·ã§ã³ïŒã¯ã©ã¹ã«ã¯ããªããžã§ã¯ãã®ãªãœãŒã¹ããã§ã«è§£æŸãããŠããããšã瀺ãbool _disposed ãã£ãŒã«ããå«ãŸããå ŽåããããŸãã 䜿ãæšãŠã¯ã©ã¹ã¯ãéãã«Disposeã¡ãœããã®ç¹°ãè¿ãåŒã³åºããèš±å¯ããä»ã®ãããªãã¯ã¡ãœãããŸãã¯ããããã£ã«ã¢ã¯ã»ã¹ãããšãã«äŸå€ãã¹ããŒããå¿ èŠããããŸãïŒãªããžã§ã¯ãã®äžå€åŒã¯æ¢ã«ç Žæ£ãããŠããããïŒã
void Dispose( bool disposing)
{
if (disposed)
return ; //
//
disposed = true ;
}
public void SomeMethod()
{
if (disposed)
throw new ObjectDisposedException();
}
* This source code was highlighted with Source Code Highlighter .
7.ïŒãªãã·ã§ã³ïŒåã®6ã€ã®ãã€ã³ããå°ãªãããããšããŸããã¯ã«ãããå Žåãã¯ã©ã¹ã¯CriticalFinalizerObjectããç¶æ¿ã§ããŸãã ãã®ã¯ã©ã¹ããã®ç¶æ¿ã«ãããè¿œå ã®ä¿èšŒãåŸãããŸãã
- ãã®ãããªã¯ã©ã¹ã®ãã¡ã€ãã©ã€ã¶ãŒã¯ãã€ã³ã¹ã¿ã³ã¹ã®æ§ç¯æã«JITã³ã³ãã€ã©ãŒã«ãã£ãŠããã«ã³ã³ãã€ã«ãããå¿
èŠã«å¿ããŠé
延ãããŸããã ããã«ãããã¡ã¢ãªã倧å¹
ã«äžè¶³ããŠããå Žåã§ãããã¡ã€ãã©ã€ã¶ãæ£åžžã«å®è¡ã§ããŸãã
- æ¢ã«è¿°ã¹ãããã«ãCLRã¯ãã¡ã€ãã©ã€ã¶ãŒã®åŒã³åºãé åºãä¿èšŒããªãããããã¡ã€ãã©ã€ã¶ãŒå
ã§ã管çãããŠããªããªãœãŒã¹ãå«ãä»ã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ãã ããCLRã¯ããåãªãèŽåœçãªããªããžã§ã¯ãã®ãã¡ã€ãã©ã€ã¶ãŒãCriticalFinalizerObjectã®ç¶æ¿è
ã®åã«åŒã³åºãããããšãä¿èšŒããŸãã ããã«ãããç¹ã«ãã¯ã©ã¹ã®ãã¡ã€ãã©ã€ã¶ãŒïŒ CriticalFinalizerObjectãç¶æ¿ããªãå ŽåïŒããSafeHandleãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããšãã§ããŸããSafeHandleãã£ãŒã«ãã¯åŸã§ç¢ºå®ã«ãªãªãŒã¹ãããŸãã
- ãã®ãããªã¯ã©ã¹ã®ãã¡ã€ãã©ã€ã¶ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ã®ç·æ¥ã¢ã³ããŒãã®å Žåã§ãåŒã³åºãããŸãã
// , ?
class Foo : CriticalFinalizerObject {}
* This source code was highlighted with Source Code Highlighter .
å»æ£ãã¿ãŒã³ã®å®çšçãªå€èŠ³
.NETã§ãªãœãŒã¹ãæäœããã®ãäžåœã«è€éã§ãããšæãããå Žåãããã«ã€ããŠ2ã€ã®ãã¥ãŒã¹ããããŸãã1ã€ã¯è¯ãããšã§ããããã1ã€ã¯ããŸãè¯ããããŸããã ãæ¬åœã«ãªãããšãããã¥ãŒã¹ã¯ãããã§èª¬æããããããªãœãŒã¹ã®æäœãé£ããããšã§ãïŒ*****ïŒãè¯ãããšã¯ãã»ãšãã©ã®å Žåããã®è€éãããã¹ãŠç§ãã¡ã«é¢ä¿ãªãããšã§ãã
Disposeãã¿ãŒã³å®è£ ã®å šäœçãªè€éãã¯ãåãã¯ã©ã¹ïŒãŸãã¯ã¯ã©ã¹éå±€ïŒã管ç察象ãªãœãŒã¹ãšç®¡ç察象å€ãªãœãŒã¹ã®äž¡æ¹ãåæã«å«ãããšãã§ãããšããä»®å®ã«é¢é£ããŠããŸãã ãããã管çãããŠããªããªãœãŒã¹ãããžãã¹ããžãã¯ã¯ã©ã¹ã«çŽæ¥ä¿åããå¿ èŠãããçç±ã«ã€ããŠèããŠã¿ãŸãããã ããããæªåé«ãåäžè²¬ä»»ååïŒSRPïŒãšåžžèã¯ã©ãã§ããããïŒ åè¿°ã®RAIIã€ãã£ãªã ã¯äœå幎ã䜿çšãããŠããããã®ãããªå Žåã«ã®ã¿èšèšãããŠããŸãã管çãããŠããªããªãœãŒã¹ãããå Žåã¯ãçŽæ¥æäœããã®ã§ã¯ãªãã管çã·ã§ã«ã§ã©ããããŠæ¢ã«æäœããŸãã
.NET FrameworkãèŠããšãããã§ãã®ã¢ãããŒãã䜿çšãããŠããããšãããããŸãããã¹ãŠã®ãªãœãŒã¹ã«ã€ããŠããªãœãŒã¹ãæäœããè€éãã®ãã¹ãŠãé ãã·ã§ã«ãäœæããããŠãŒã¶ãŒã«ãªãœãŒã¹ãæ瀺çã«ã¯ãªã¢ããDisposeã¡ãœããã®åŒã³åºãã®ã¿ãæäŸããŸãïŒãããŠããã¡ã€ãã©ã€ã¶ãŒã念ã®ããïŒã ããã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ãšãã©ã®ç®¡çãããŠããªããªãœãŒã¹ã«ã€ããŠã¯ããã®ãããªã·ã§ã«ã¯æ¢ã«äœæãããŠãããè»èŒªãåçºæããå¿ èŠã¯ãããŸããã
ããããã¹ãŠãã ããžãã¹ããžãã¯ãšãã³ãŒãå ã§ã¢ã³ãããŒãžãªãœãŒã¹ãæäœããããã®ããžãã¯ãæ··åšãããå¿ èŠããªããšããäºå®ã«ã€ãªãããŸã ã ãããšå¥ã®ãã®ã¯ããèªäœããªãé£ãããå¥ã®ã¯ã©ã¹ã«å€ããŸãã ãããã£ãŠããã®ãã¿ãŒã³ã¯éåžžã«ãŸããªã±ãŒã¹ïŒã¯ã©ã¹ã«ãããŒãžãªãœãŒã¹ãšã¢ã³ãããŒãžãªãœãŒã¹ã®äž¡æ¹ãå«ããããšãã§ããïŒã«å¯ŸããŠãæé©åããããŠããäžæ¹ã§ãã¯ã©ã¹ã«ãããŒãžãªãœãŒã¹ã®ã¿ãå«ãŸããæãäžè¬çãªã±ãŒã¹ã¯å®è£ ãšä¿å®ãéåžžã«äžäŸ¿ã§ãã
å»æ£ãã¿ãŒã³ã®ç°¡æããŒãžã§ã³
ããªããšç§ã誰ããããŒãžããªãœãŒã¹ãšã¢ã³ãããŒãžããªãœãŒã¹ã1ãæã«æ··åšãããªãããšãç¥ã£ãŠããã®ã§ããã°ãã³ãŒãã§ãããæ瀺çã«å®è£ ããŠã¿ãŸãããïŒ Disposeã¡ãœãããçµäºããè¿œå ã®Disposeã¡ãœããã®ä»£ããã«å®å šã«èãããªãããŒã«åãã©ã¡ãŒã¿ãŒã䜿çšããŠãä»®æ³DisposeManagedResourcesã¡ãœãããè¿œå ããŸãã ãã®ã¡ãœããã®ååããããããŒãžãªãœãŒã¹ã解æŸããå¿ èŠãããããšãæ確ã«ããããŸãã ãã®ã¡ãœããã®ã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ã DisposeïŒ boolïŒã¡ãœããã«äŒŒãŠããå¿ èŠããããŸãã å°å°ãããŠããªãã¯ã©ã¹ã«ã¯ä¿è·ããã ä»®æ³ ãå°å°ãããã¯ã©ã¹ã«ã¯ãã©ã€ããŒã ã
class SomethingWithManagedResources : IDisposable
{
public void Dispose()
{
// Dispose(true) GC.SuppressFinalize()
DisposeManagedResources();
}
// ,
protected virtual void DisposeManagedResources() {}
}
* This source code was highlighted with Source Code Highlighter .
äžèŠããã®ã¢ãããŒãã¯å®éçãããããã«æãããããããŸãããããèªèº«ã§å€æããŠãã ãããã Framework Design Guidelines ãã®æ¬ã«ã¯ãDisposeãã¿ãŒã³ã®èª¬æã«åãããã20ããŒãžããããŸãããèè ã¯ã絶察ã«å¿ èŠãªå Žåã«ã®ã¿ãã¡ã€ãã©ã€ã¶ãè¿œå ããããšãæšå¥šããŠããŸãã åæã«ã1ã€ã®ã¯ã©ã¹ã«2çš®é¡ã®ãªãœãŒã¹ãæ··åšãããããšã¯æªãããšã§ãããããã§ãçŠæ¢ã§ã¯ãªã奚å±ãããã¿ãŒã³ã«åŸã£ãŠããŸãã
ãããã«
ä»ã®å€ãã®ãããžã§ã¯ãã§äœ¿çšãããã©ã€ãã©ãªã¯ã©ã¹ãŸãã¯ããžãã¹ã¯ã©ã¹ãéçºããå Žåãäžèšã®ãã¹ãŠã®ååã«åŸãããšã¯éåžžã«åççã§ãã åå©çšå¯èœãªã³ãŒãã«ã¯ä»ã®èŠä»¶ããããèšèšæã«ã¯ä»ã®ååã«åŸãå¿ èŠããããŸããã¡ã³ããã³ã¹ã³ã¹ããããããã®ãããªã¯ã©ã¹ã®äœ¿ãããããšæ¡åŒµæ§ãã¯ããã«éèŠã§ãã
ãŠãŒã¶ãŒæ°ãéãããããžãã¹ããžãã¯ã¯ã©ã¹ãŸãã¯åçŽãªã©ã€ãã©ãªãèšèšããŠããå Žåããæšæºãã«ã ãŸãããããšã¯ã§ããŸãããããããŒãžãªãœãŒã¹ã§ã®ã¿æ©èœãããã®ãã¿ãŒã³ã®ç°¡æããŒãžã§ã³ã䜿çšããŠãã ããã
------------------------------
ïŒ*ïŒC ++ã§ã¯ãCïŒãšã¯ç°ãªããã¡ã¢ãªããªãœãŒã¹ã§ãã ãããã£ãŠãC ++ã®RAIIã€ãã£ãªã ã¯ãåçã«å²ãåœãŠãããã¡ã¢ãªã®è§£æŸãšãOSèšè¿°åããœã±ãããªã©ã®ä»ã®ãªãœãŒã¹ã®è§£æŸã®äž¡æ¹ã«äœ¿çšãããŸãã
ïŒ**ïŒJava 7ã§ã¯ãCïŒïŒtry-with-resourceã¹ããŒãã¡ã³ãã䜿çšããå Žåãšåæ§ã®ãã¶ã€ã³ãæçµçã«ç»å ŽããŸããã
ïŒ***ïŒæ®å¿µãªãããCïŒã§ã¯ããã¡ã€ãã©ã€ã¶ïŒãã«ãã®åŸã«ã¯ã©ã¹åãç¶ãïŒã®æçµæ§æãéžæãããŸããããã¯ãC ++ã®ãã¹ãã©ã¯ã¿ã«äœ¿çšãããŸãã ãããããã¹ãã©ã¯ã¿ã¯æ±ºå®è«çãªãªãœãŒã¹ã®è§£æŸãæå³ããŸããããã¡ã€ãã©ã€ã¶ã¯ããã§ã¯ãªãããããã¹ãã©ã¯ã¿ãšãã¡ã€ãã©ã€ã¶ã®ã»ãã³ãã£ã¯ã¹ã¯éåžžã«ç°ãªããŸãã
ïŒ***ïŒã¯ããããã¯.NETãšC ++ã®åäœã«ãããå¥ã®éãã§ãã åŸè ã§ã¯ããã¹ãã©ã¯ã¿ã¯å®å šã«æ§ç¯ããããªããžã§ã¯ãã«å¯ŸããŠã®ã¿åŒã³åºãããŸããããã¹ãã©ã¯ã¿ã¯å®å šã«æ§ç¯ããããã¹ãŠã®ãã£ãŒã«ãã«å¯ŸããŠåŒã³åºãããŸãã
ïŒ****ïŒããšãã°ãããã§ã¯ãäŸå€ãçºçãããšãã«ããªãœãŒã¹ãªãŒã¯ããååŸããæ¹æ³ãã IDisposableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå€æŽå¯èœãªæå³ã®ããã¿ã€ãã®åé¡ã«ã€ããŠã¯èª¬æããŸããã§ããã ããã«ã€ããŠã¯ããã§ã«ã äŸå€ã®ã»ãã¥ãªãã£ä¿èšŒ ããšã å¯å€ã®éèŠãªã¿ã€ãã®å±éºæ§ã«ã€ã㊠ãã®ããŒãã§ãã§ã«æžããŠããŸãã