public void Method()
{
var disposable = new DisposableObject();
}
DisposableObject는 IDisposable입니다.처리 방법이 GC에 의해 자동으로 호출됩니까?
이 경우 Dispose 메서드는 GC에 의해 자동으로 호출됩니까?
public void Method()
{
var disposable = new DisposableObject();
}
DisposableObject는 IDisposable입니다.처리 방법이 GC에 의해 자동으로 호출됩니까?
이 경우 Dispose 메서드는 GC에 의해 자동으로 호출됩니까?
이 경우 Dispose 메서드는 GC에 의해 자동으로 호출됩니까? 그것은 당신이 스스로 전화 또는 예외의 경우에 그 처리를 보장합니다
using
블록을 사용할 필요가Dispose
호출하지 않습니다
번호.
using(var disposable = new DisposableObject())
{
//your code
}
IDisposable
GC
은 파일 처리기와 같이 관리되지 않는 리소스가 보유한 리소스를 릴리스 할 수 없으므로
아니요 GC가 일회용 개체 (IDisposable을 구현하는 개체)에서 Dispose를 호출하지 않습니다. GC는 관리 객체의 finalizer (소멸자)를 호출하여 객체 정리를 관리합니다. 리소스가 해제 될 때 해제 된 경우 (해제되지 않았을 때) 을 제어하려는 경우 Dispose 메서드를 구현합니다.
예 : TCPClient 멤버가있는 클래스가있는 경우 리소스를 제어하는 관리 대상 객체 (연결된 포트)입니다. 클래스에 IDispose를 구현하지 않은 상태에서 인스턴스를 사용하면 GC가 TCPClient를 더 이상 사용하지 않는다고 판단하고 해당 객체를 종료하고 포트가 닫힙니다. 그러나 WHEN을 제어 할 수는 없습니다. 우연히 있다. 포트 및 특정 시간에 액세스해야하는 경우에는 닫을 때를 제어해야합니다.이 경우 IDispose를 함축하고 using 문을 사용하거나 직접 Dispose를 호출하여 자원 (포트)을 해제 할 수 있습니다. 클래스가 Finalize
라는 방법 및 그 클래스의 인스턴스를 무시하는 경우
명확성을 위해서, 이것이 사실 일 때 마무리 자에서'Dispose'를 호출해야합니다 : "If 클래스에 IDispose를 구현하지 않고 인스턴스를 사용하면 GC가 TCPClient가 더 이상 사용되지 않는다고 판단하여 해당 객체를 마무리하고 포트를 닫습니다. " – jltrem
해당 인스턴스에 호출 된 GC.SuppressFinalize()
없이 포기 된 것으로 발견되면, GC는 그의 Finalize
것들의 목록에있는 개체에 대한 참조를 저장합니다해야 최대한 빨리 달리고 (일시적으로 부활 시키십시오) 다음 번에 버려지면 사라질 것입니다. 즉각적인 마무리 작업을 위해 개체가 목록에 배치 된 경우 GC는 Finalize
메서드를 실행하는 스레드를 시작합니다.
, C 번호의 제작자가 직접 Finalize
를 오버라이드 (override)에서 프로그래머를 금지하고 대신 프로그래머가 연상 구문, 그들이 "소멸자"라고 부르는 구조를 사용 Finalize
을 무시하고자하는 것을 요구함으로써 것들을 조금 혼동하기로 결정 C + + 소멸자,하지만 완전히 다른 의미. C#은 약간의 래퍼 코드를 추가하지만 일반적으로 ~className {whatever}
은 Finalize
을 오버라이드하는 것과 동일하다고 생각할 수 있습니다.
마이크로 소프트는 하나 Finalize
를 무시 (또는 C#을 소멸자를 구현하는) 경우, 그 무시/소멸자 단순히 매개 변수 값 False
을 전달, 서명 void Dispose(bool)
와 메소드를 호출해야하는 것이 좋습니다. 이 조언에 따르면 사람들은 GC가 Dispose
라고 부르는 아이디어를 얻습니다. GC 자체가 인 경우 Dispose
을 호출하지 않습니다. 또한 대부분의 객체 은이 C# 소멸자를 구현하거나 다른 방법으로 Finalize
을 무시하면 안됩니다.Finalize
과 관련된 모든 사례를 이해하지 못하는 경우 일반적으로 IDisposable.Dispose
이 으로 불려지기 전에 개체를 버리지 않는 것이 좋습니다.
개체가 모든 소스에서 역 참조되고 GC가 다음 라운드를 만들 때 호출됩니다. –
** 아니요 **, Dispose() 메소드가 아니라 소멸자 (** finalizer **)를 호출합니다. 파이널 라이저 내부에서 일반적으로 구현은 Dispose() 메소드를 호출합니다 (Dispose 패턴을 따르는 경우). –
@JeroenVannevel 아니요, Dispose() 메서드를 호출하지 않고 finalizer (implementation _may_ call Dispose()) –