2012-05-04 2 views
3

클래스가 두 개 있는데, 클래스 MyFirstClassMyAnotherClass, MyAnotherClass이 IDiposable 인터페이스를 구현하고 있습니다.자식 개체를 삭제하거나 삭제하지 않습니까?

public class MyFirstClass 
{ 
    public string xyz{get;set;} ..... and so on 
} 


public class MyAnotherClass : IDisposable 
{ 
    private readonly MyFirstClass objFc = new MyFirstClass(); 
    public static void MyStaticMethod() 
    { 
     var objOfFirstClass = new MyFirstClass(); 
     // something with above object 
    } 

    public void MyNonStaticMethod() 
    { 
     // do something with objFc 
    } 

    #region Implementation of IDisposable 
    .... my implementations 
    #endregion 
} 

지금은 내가 MyAnotherClass를 호출하고 한 번 더 클래스, 그래서 난 내 개체의 정리 시나리오에 대해 걱정한다 알고 싶습니다이

using(var anotherObj = new MyAnotherClass()) 
{ 
    // call both static and non static methods here, just for sake of example. 
    // some pretty cool stuffs goes here... :) 
} 

같은이? 또한 내 ObjFC (정적이 아닌 부분)과 objOfFirstClass (정적 인 부분)은 어떻게됩니까?

AFAIK는 ...

+1

'MyFirstClass'클래스는 'IDisposable'을 구현하지 않습니다. 이것은 의도에 의한 것인가? – Yogu

+0

예 ... 이것은 의도 된 것입니다 ... –

답변

9

objOfFirstClass 모든 것을 알아서 ...하지만 내가 더 알아야합니다 사용하는 방법에 로컬 변수입니다. 메소드가 종료되면 가비지 콜렉션을받을 수 있습니다. IDisposable을 구현하지 않아 처분되지 않습니다.

objFc은 상위 개체가 범위를 벗어날 때 가비지 수집 대상입니다. 다시 말하지만, 이것은 처분과 관련이 없습니다. 간단한 메모리 관리 이외의 이 완료 될 정리가있을 때

Dispose/IDisposable

가 사용됩니다. CLR은 가비지 수집을 사용하여 메모리를 정리합니다. usingIDisposable을 구현하는 오브젝트가 완료되었을 때 호출되는 Dispose 메소드를 가지고있는 좋은 방법입니다.하지만 이후의 모든 것이 메모리 관리이면 사용하지 않아도됩니다.

+0

IDisposable이 구현되고 클래스가 정적이 아닌 클래스에서 정적 메서드를 사용하는 경우 어떻게됩니까? 정적 객체는 사용 후 메모리에서 사용할 수 있거나 가비지 수집을 위해 수행됩니다. –

+0

정적 _fields_로 정의 된 객체는 메모리에 남아 있지만 정적 _methods_의 로컬 변수는 메소드가 종료되면 수집 할 수 있습니다. –

0

IDispose은 클래스 MyAnotherClass을 처리합니다. 즉, MyFirstClass 개체의 로컬 변수는 아무 것도 가리키고 있지 않습니다. 따라서 가비지 컬렉터가 실행되면 다시 회수됩니다.

+0

가비지 수집 자격은 범위를 벗어나는 변수를 기반으로합니다. 배출은 그것과 아무 관련이 없습니다. –

1

usingDispose 메서드를 호출한다는 점을 제외하고는 IDisposable 뒤에 어떤 마법도 없습니다.

MyFirstClass 클래스는 IDisposable을 구현하지 않으므로이 클래스의 인스턴스에 대해 걱정할 필요가 없습니다. 따라서 처리 할 항목이 없어야합니다.

처분해야 할 필드 나 변수가있는 경우 Dispose으로 전화해야합니다.

~MyClass() { 
    Dispose(false); 
} 

부울 매개 변수 필드 이 경우, 배치하지 않도록 지정 : 또한 the reference proposesDispose 메소드를 호출 소멸자를 구현해야합니다. 자세한 내용은 연결된 msdn 페이지를 참조하십시오.

+0

영어로 된 MSDN 링크는 영어로 말하는 사이트에서 더 좋을 것입니다 ...;) –

+0

죄송합니다, 방금 소스 코드를 살펴 보았습니다. 결정된. – Yogu

2

IDisposable은 개체가 관리되는 메모리가 아닌 이외의 리소스를 사용하고 있음을 나타냅니다. 예를 들어, 파일 핸들. Dispose 메서드는 이러한 리소스의 정리를 처리하기로되어 있습니다 (구현에서 수행해야하는 작업입니다).

모든 CLR 기본 개체 (예 :귀하의 예에서) CLR에 대한 참조가 더 이상 없을 때 (더 구체적으로 가비지 컬렉터 또는 GC라고하는 메커니즘에 의해) 가비지 수집됩니다. 이 경우에는 IDisposable이 필요하지 않습니다.

IDisposable을 사용하려면 Dispose으로 전화해야합니다 (또는 구문상의 설탕 인 using을 사용해야합니다). GC에 의해 자동으로 호출되지는 않습니다.

관련 문제