2009-09-14 5 views
5

변수가 .Net 언어로 범위를 잃는 즉시 "자동으로"최종/소멸자 코드를 실행할 수있는 방법이 있습니까? 가비지 콜렉터가 불확정 한 시간에 실행되기 때문에 변수가 범위를 잃 자마자 소멸자 코드가 실행되지 않는 것으로 보입니다. IDisposable에서 상속받을 수 있고 명시 적으로 내 객체에 Dispose를 호출 할 수 있다는 것을 알았지 만, non -.Net C++에서 객체 파괴를 처리하는 것과 같은 더 손쉬운 솔루션이있을 수 있기를 기대했습니다.오브젝트가 .NET에서 범위를 벗어날 때 코드를 실행할 수 있습니까?

원하는 동작 (C 번호) :

public class A { 
    ~A { [some code I would like to run] } 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
    // At this point, I would like my destructor code to have already run. 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
} 

바람직하지 :

public class A : IDisposable { 
    [ destructor code, Dispose method, etc. etc.] 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
    try { 
     ... 
    } 
    finally { 
     myA.Dispose(); 
    } 
} 

답변

9

이 구조를 사용하면 당신이 원하는 가장 가까운 온다 :

using(FileStream stream = new FileStream("string", FileMode.Open)) 
{ 
    // Some code 
} 

이에 컴파일러에 의해 대체된다 예외가 발생한 경우에도 자동으로 호출됩니다. 그러나 당신의 클래스는 IDisposable을 구현해야합니다.

그러나 그렇다고해서 개체가 메모리에서 제거되지는 않습니다. 너는 그걸 통제 할 권한이 없다.

+0

("+1") "사용"은 Dispose 메서드를 사용하기위한 약식이며 특히 소멸자를 사용하고 메모리에서 개체를 제거하는 데 사용하지 않는 것이 좋습니다. –

4

는 IDisposable을 구현하는 객체와 함께 사용하여 키워드 그냥 않습니다. 예를 들어

는 :

using (MyClass o = new MyClass()) 
{ 
... 
} 

폐기는()입니다 :

FileStream stream = new FileStream("string", FileMode.Open); 
try 
{ 
    // Some code 
} 
finally 
{ 
    stream.Dispose(); 
} 
3

불행히도, 아니요.

가장 좋은 옵션은 IDisposableIDisposable pattern으로 구현하는 것입니다.

+0

참조 http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – TrueWill

관련 문제