2017-01-26 3 views
0

은 : 테스트 실행시에 ctor클래스에 정적 필드가 포함되어 있으면 C# 클래스 소멸자가 호출됩니까? 다음 코드

public sealed class Switch 
{ 
    public static MyObj s_object = new MyObj(); 
    private readonly SomeObject m_object = new SomeObject(); 

    ~Switch() 
    { 
     m_object?.Dispose(); 
    } 
} 

public class Test() 
{ 
    Test() 
    { 
     Switch switch = new Switch(); 
     switch = null; 
     ... 
    } 
} 

새로운 스위치 객체는 즉시 널로 설정 생성된다. 어떤 시점에서 GC는 처리 할 때 소멸자 인 ~Switch()을 호출하여 처리합니다. 그러나 클래스에 s_object과 같은 정적 필드가 있고 호출하는 앱이 종료되지 않은 경우 (앱 도메인이 아직로드 됨) 발생합니까? 정적 객체는 응용 프로그램의 수명 동안 지속됩니다. 그게 포함 된 비 정적 클래스를 의미합니까?

+0

이것이 당신의 상황에 적용되는지는 잘 모르겠지만, 일반적으로 자원을 정리하려면 일반적으로'IDisposable'을 구현해야하며 정리할 관리되지 않는 항목이있는 경우에만 소멸자를 사용해야합니다. –

+1

@ C.Evenhuis C#은 소멸자조차 가지고 있지 않으며, 매우 다른 일을하는 finalizers를 가지고 있습니다. – Mgetz

+0

@ C.Evenhuis finalizer의 정의를 볼 때, 관리되지 않는 리소스가 있다는 것을 실제로 볼 수 있습니다. 그래서 finalizer가 없어야하고,'IDisposalbe '를 구현해야합니다. – Servy

답변

3

이것은 문제가되지 않습니다. 정적 필드는 이런 식으로 메모리 표현과 관련하여 정의 된 유형의 인스턴스와 관련이 없습니다.

확인 자세한 정보를 원하시면,이 게시물 : static 필드의 How exactly do static fields work internally?

2

존재는 객체가 쓰레기 수집 (따라서 확정)입니다 타이밍에 영향을주지 않습니다. 인스턴스는 정적 필드없이 발생하는 시간에 필적 할만큼 잘 마무리됩니다.

정적 필드가 인스턴스에 미치는 유일한 영향은 첫 번째 인스턴스가 만들어지기 전에 정적 초기화가 발생하므로 나머지 인스턴스보다 느리게 첫 번째 인스턴스를 만들 수 있다는 것입니다.

참고 : 게시물의 코드는 다른 Managed Object를 참조하고 거기에서 메소드를 호출하려고하기 때문에 finalizer의 유효하지 않은 구현을 보여줍니다. 두 가지 경우 모두에 대해 정의되지 않은 동작이 발생합니다 (정적 필드 사용/사용 안 함).

+0

문제는 정적 콘텐츠가 포함되어있을 때 클래스가 삭제 될 것인지 아닌지에 대한 질문입니다. 타이밍에 대해서는 그렇게 중요하지 않습니다. –

+0

@DiskCrasher 당신의 질문을 완전히 잘못 읽은 것 같아요. "~ Switch() finalizer가 정적 필드가 있다면 다른 시간에 (또는 전혀) 호출 될지"를 읽고 정적 필드 finalizer에 대한 호출의 타이밍을 변경하지 않습니다 (따라서 정적 필드없이 호출이 발생하면 클래스에 정적 필드가있을 때 비슷한 시간에 발생합니다). 하지만 진짜 질문은 실제 처분에 대한 것 같습니다 - 게시물의 코드를 기반으로하는 것보다'm_object' 처분은 두 경우 모두 정의되지 않습니다 (다른 객체가 finalizer에서 정의되지 않은 경우 상태로) –

관련 문제