가의 악명 높은는 IDisposable 인터페이스를 살펴 보자되는 방식을 설계되었습니다 : 현재 개체가 이미 설치되어있는 경우 MSDN에서 권장하는대로,이유는 IDisposable 구현이
[ComVisible(true)]
public interface IDisposable
{
void Dispose();
}
전형적인 구현 (I 체크를 생략) :
public class Base : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// release managed
}
// release unmanaged
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Base()
{
Dispose(false);
}
}
public class Derived : Base
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
// release managed
}
// release unmanaged
disposed = true;
}
}
문제점 :이 구현은 반 직관적이라고 생각합니다. 또한 기본 클래스와 파생 클래스도 크게 다릅니다. 파생 클래스는 으로 기본 클래스가 IDisposable을 올바르게 구현 한으로 가정하고 원래 인터페이스의 일부조차도 아닌 Dispose (bool)를 재정의합니다.
저는 보통 중학교 프로그래머에게 면접 시험에서 IDisposable을 구현하도록 요청했기 때문에이 질문을 생각해 냈습니다. 이 구현은 더 명확하고 더 일관성, 나에게
public class Base : IDisposable
{
public virtual void Dispose()
{
// release managed and unmanaged
GC.SuppressFinalize(this);
}
~Base()
{
// release unmanaged
}
}
public class Derived : Base
{
public override void Dispose()
{
// release managed and unmanaged
base.Dispose();
}
~Derived()
{
// release unmanaged
}
}
: 그들은 정확히 완료해야하는데 방법을 모르는 경우, 그들은이 가까이에 뭔가 들고 오지. 물론 나쁜 점은 관리되지 않는 리소스를 두 곳에서 릴리스해야한다는 것입니다.하지만 중요한 점은 99 % 이상의 사용자 정의 클래스가 처리 할 관리되지 않는 항목이 없으므로 어쨌든 최종자를 필요로하지 않는다는 것입니다. 나는 주니어 프로그래머에게 왜 MSDN 구현이 더 나은지 설명 할 수 없다. 왜냐하면 내가 직접 이해하지 못하기 때문이다.
그래서 이상한 디자인 결정 (파생 클래스가 인터페이스의 메서드와 다른 메서드를 재정의하고 그를 포함하지 않는 관리되지 않는 리소스에 대해 생각하게 만드는)이 궁금합니다. 이 문제에 대한 어떤 생각?
틀린. 리소스를 관리하는 경우 IDisposable을 구현하고 처리해야합니다. – SLaks
항상 그렇지는 않습니다. 네이티브 리소스가있는 형식을 캡슐화하거나 인수 분해 된 형식을 구현할 수 있습니다. –
@SLaks : 리소스가 완전히 관리되는 경우 덜 중요합니다 (완전히 관리되는 유형이 GC에 의해 올바르게 처리되므로 ...) –