처분 비교를 사용하지 않는 것이 좋습니다. 첫 번째 구문 분석에서 관리되지 않는 리소스를 제거합니까?. NET FINALIZE CONCEPT 문제
마무리를 억제하는 것은 무엇입니까?
처분 비교를 사용하지 않는 것이 좋습니다. 첫 번째 구문 분석에서 관리되지 않는 리소스를 제거합니까?. NET FINALIZE CONCEPT 문제
마무리를 억제하는 것은 무엇입니까?
는 IDisposable의 구현은 다음과 같아야 객체가 종료자를 갖는
public MyClass : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected Dispose(bool disposing)
{
if(disposing)
{
// release unmanaged resource
}
// release managed resources
}
~MyClass()
{
Dispose(false);
}
}
경우 CLR은 마무리의 대기열에 대한 참조를 유지한다. (Dispose()를 호출하는) 객체를 수동으로 처분하는 경우에는 관리되지 않는 리소스를 이미 제거합니다 (dispose 및 finalizer가 공유됨에 따라). 따라서 finalizer를 호출 할 필요가 없으므로 안전하게 객체를 제거 할 수 있습니다 대기열 (GC.SuppressFinalize (this) 호출).
일반적으로 Dispose 및 Finalize는 관리되지 않는 리소스 (예 : 핸들)를 정리합니다. GC가 개체가 더 이상 사용되지 않는 것을 감지하면 두 가지 중 하나가 발생합니다. 최상의 경우, 객체를 마무리 할 필요가없는 경우 (관리되지 않는 리소스가 있거나 억제 마무리라고하는 사람이있는 경우) 바로 정리됩니다. 최악의 경우 finalizer가 실행되고 객체가 완전히 정리 될 때까지 finalize가 필요한 다른 영역에 배치되고 수명이 길어집니다 (관리되지 않는 리소스에 더 오래 걸림).
마무리가 필요한 많은 개체를 사용하면 성능에 큰 영향을 줄 수 있습니다. Disposing은 두 가지 목적을 수행합니다. 즉, 관리되지 않는 리소스를 돌려 주며 GC를 중단시키는 Finalizer를 억제합니다 (Dispose를 올바르게 구현했다고 가정). 그래도 사람들은 Dispose (또는 Using)를 사용하는 것을 잊어서 finalizer가 반드시 존재해야합니다. 그것에 의지하지 마십시오.
블로그 게시물 How to Implement IDisposable and Finalizers: 3 Easy Rules을 작성하여 각각의 사용시기와 사용 방법에 대해 자세히 설명합니다. 나는 또한 약간의 Q를 가지고있다 &으로서 on the subject.
IDisposable
(및 해당 FxCop 규칙)을 구현하는 방법에 대한 악명 높은 Microsoft 설명서는 끔찍한 구식입니다. 그들은 정확히 마이크로 소프트가 IDisposable
을 .NET 1.0에서 어떻게 구현했는지 설명합니다. v2.0이 나왔을 때 BCL의 거의 모든 클래스는 내 블로그 게시물에 설명 된 것과 유사한 지침을 따르도록 개조되었습니다. 유일한 차이점은 은에 기본 클래스로 사용하도록 설계된 클래스의 Dispose(bool)
을 보호합니다. . 특히 BCL 클래스는 관리 리소스와 관리되지 않는 리소스를 모두 담당합니다.
한숨은 신화가 IDisposable의 일반적인 구현은 쫓아내는 것이 불가능합니다. –
IDisposable을 올바르게 구현하는 방법에 대한 링크를 공유 할 수 있습니까? – munissor
내 대답보기. :) –