2010-11-19 2 views
4

C#의 소멸자에 대한 기사를 읽었으나 괜찮은 유스 케이스를 찾는 데 어려움을 겪고 있습니다.C# 소멸자의 샘플 사용

누군가가 설명과 함께 사용 예를 제공 할 수 있습니까?

많이 감사합니다.

업데이트
책의 코드 예제는 Desctuctor과 폐기() 메소드 모두,이 책에서이 코드를 참조 구현합니다. 마르코

+0

http://www.devx.com/dotnet/Article/33167/0/page/2 꽤 좋은 기사 ... –

답변

8

종결자는 매우 희박합니다.은 거의 필요하지 않습니다. 그들은 으로 기본 리소스에 직접 액세스 할 때을 사용해야했지만 이제는 보통 SafeHandle을 사용해야합니다. 는 C# 사양의 ECMA 버전 그들에게 말한다 : 읽어 :)

용어에 대한 빠른 노트 그렇게 가서 -

조 더피는 나 자신을 쓸 수있는 것보다 오히려 더 자세한 사항에 어울릴 excellent post about this있다 finalizers로; 마이크로 소프트 버전의 스펙은 항상 소멸자로 언급하고 계속 그렇게하고 있습니다.

+0

어디 계십니까? 기차에서? = P 메타에 게시 된 일정을 읽었습니다. 나는 당신이 당신의 스케줄을위한 upvotes를 얻고있는 동안 많이 웃었다! Hehehe ... 아니, 나는 타임 존을 고려해야한다. 그래서 집에 있어야하고, TV를 보지 않아야한다. = P 어쨌든! 좋은 밤 보내! =) –

+0

@Will : 게시 및 재생 PixelJunk Monsters 사이의 번갈아 :) –

+0

얼마나 훌륭한 기사 - 감사합니다! 다행히 SafeHandle 구현 덕분에 사용할 필요가 거의 없습니다. – Marko

2

class MyClass 
{ 
    bool disposed = false; // Disposal status 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    ~MyClass() 
    { 
     Dispose(false); 
    } 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed == false) 
     { 
      if (disposing == true) 
      { 
       // Dispose the managed resources. Factored Dispose 

      } 
      // Dispose the unmanaged resources. 

     } 
     disposed = true; 
    } 
} 

그들은 파이 나라, 아니 소멸자이야. 종종 관리되지 않는 리소스를 정리하는 데 사용됩니다. 직접 파일 클래스를 작성한 경우 파이널 라이저를 사용하여 원시 파일 핸들을 정리해야합니다.

+0

'desscturctors를 "소멸자"라고 불러야하는지 또는 2007 년 말에 발표 된 "finalizers", C# 언어 사양 버전 3.0은이 메서드를 소멸자라고 부릅니다. "- Apress Illustrated C# 2008. 이후 변경 되었습니까? 또한, 일부 예제 코드는 환상적입니다! – Marko

+0

좋아, 내 예제 코드 주석을 무시, 거의 사용하지 않는 것처럼 보입니다! – Marko

0

IDisposable 인터페이스는 소멸자/finalzer로 사용할 수있는 방법을 제공합니다.

내 말은 객체가 사용하는 리소스를 해제하려면 IDisposable 인터페이스를 구현할 수 있다는 것입니다. 다른 사람들이 말했듯이 이것은 Dispose() 메서드가 직접 호출되지 않기 때문에 좋은 오래된 소멸자와 같은 것이 아니라 잠시 후 개체를 처리하는 관리 코드에 의해 수행됩니다.

+0

나는 downvotes와 괜찮지 만, 오류가 있다면 내 오류에서 배울 수 있도록 적어도 틀린 말을해라! Mark Byers는 'IDisposable'인터페이스 사용을 제안합니다. –

+0

아니, 그들은 매우 다릅니다. 'Dispose'는 다른 코드에 의해 * 명시 적으로 호출됩니다. 반면 destructors/finalizer는 가비지 컬렉터에 의해 비 결정 론적으로 호출됩니다. –

+0

안녕하세요 : +1! 너 먼저 거기있어. – n8wrl

1

Finalizer는 C#에서는 거의 필요하지 않으며 가비지 수집기를 추가하면 가비지 수집기가 최종본을 실행하는 데 추가 패스가 필요하므로 가비지를 정리하는 데 오래 걸릴 수 있습니다. 대신 일반적으로 IDisposable 패턴을 사용해야합니다.

finalizer의 사용 예는 자원 유출이 의심되는 경우 디버깅 할 때 객체를 가비지 수집하기 전에 Dispose이 올바르게 호출되었는지 검사 할 수 있습니다. 관리되지 않는 리소스를 보유하고있는 객체에 Dispose가 호출되기 전에 호출 된 finalizer가 있으면 리소스 누수의 징후 일 수 있습니다. 그러나 finalizer가 호출되지 않을 수도 있기 때문에 응용 프로그램에 중요한 논리가 포함되어서는 안됩니다.

+0

내가 읽는 책의 코드는 흥미롭게도 Dispose와 Destructor (실제로 Dispose (false)를 호출 함)를 구현합니다. – Marko

+0

@ Marko 그 패턴은 .net 2.0에서'SafeHandle's가 소개되기 전에 일반적이었습니다.지금은 사용되지 않습니다. – CodesInChaos

+0

두 분 덕분에 책의 샘플 코드를 참조로 추가했습니다. – Marko

1

무엇이 destructor입니까? C#을 더 이상 필요하지 않을 때 핸들을 닫습니다 결정적 파괴
유용한 사용할 것

  • IDisposable 패턴을 가지고있다. 따라서 그들은 닫힌 지금 때마다 GC가 훨씬 늦게 또는 전혀 않을 수도 있습니다 개체를 수집하기로 결정 때마다.
    또는 객체 그래프에서 이벤트 자체를 제거하라는 순수 관리 코드에서 ...
    일반적으로 using 문과 함께 사용됩니다.
  • 거의 쓸모없는 마무리 도구입니다. 그것은 알 수없는 시간에 실행, 전혀 실행되지 않을 수도 있습니다 ...
    내가 그것을 사용하는 유일한 것은 내가 전화를 잊었을 것을 상기시키는 것입니다
    그것은 C + + 소멸자의 구문을 가지고 있지만 나는 그것을 C++ 소멸자와 같은 것으로 생각하지 마십시오. 나는 소멸자로 Dispose()을 생각하는 것을 선호한다. 네이티브 자원

사용

  • Critical finalizationSafeHandles 내가 대신 개인하여 SafeHandle을 소유하고 그것을 자신의 폐기에 Dispose 메소드의 호출해야합니다 현대적인 코드를 게시 한 패턴의 생각합니다.

  • 0

    C#에는 '파괴자'가 없습니다. .NET의 가비지 수집기를 사용하면 클래스가 범위를 벗어날 때 곧바로 개체 컬렉션이 생성되지 않습니다.

    나는 당신이 더 관심있는 것이 IDisposable 패턴이라고 생각합니다. 이는 객체가 사용하는 리소스를 정리할 수있는 결정적인 방법입니다.

    또한 .NET 클래스에는 개체를 수집 할 때 실행되는 'finalizer'가있을 수 있습니다. 객체의 원래 호출자가 무시한 경우 처 리를 호출하는 데 사용할 수 있습니다.

    그러나 클래스에 finalizer를 구현하면 GC를위한 특수 처리를 위해 대기열에 대기하게되고 성능에 영향을 미칠 수 있습니다.