2011-11-24 5 views
1

웹 소스를 통해 크롤 링하는 동안, 나는 다음과 같은 방법을 보이는 boiletplate 코드가 많이 발생했습니다.폐기 객체 예외는

이제, 이러한 방법들 각각이 갖는 기본 정신 검사 :

if (inputBuffer == null) 
    throw new ArgumentNullException("inputBuffer"); 
if (outputBuffer == null) 
    throw new ArgumentNullException("outputBuffer"); 
if (inputCount < 0) 
    throw new ArgumentException("inputCount", "< 0"); 

그러나합니다 (IDisposable 인터페이스 구현으로 인해)은 다음 수표 각 방법에 추가된다

if (disposed) 
    throw new ObjectDisposedException("MethodName"); 

지금 - 이 일반적인 관행입니까? 오래된 일회용 수업을 리엔지니어링하고 이러한 수표를 구현해야합니까?

+0

http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx Dispose' 섹션 – Snowbear

답변

1

귀하의 사용 방법에 따라 다르지만, 의심 스럽다면 추가하지 않아도됩니다.

다른 프로그램 (예 : 라이브러리 및 프레임 워크)에서 사용하기위한 클래스의 경우이 검사를 항상 수행하고 다른 응용 프로그램에서 오류를 진단하고 클래스를보다 강력하게 만들 때 올바른 예외가 throw됩니다.

내 응용 프로그램에서만 사용하려는 내부 클래스의 경우 메서드를 호출 할 때 오류가 빨리 발생하는지 확인하지 않아도됩니다. 예 : 클래스의 모든 메소드가 스트림을 사용하고 해당 스트림이 폐기되거나 null로 설정된 경우 예외가 꽤 빨리 발생합니다.

내부 클래스에 오류가 발생하지 않는 메서드가있는 경우 개체가 삭제 된 후에 일부 메서드가 여전히 작동하는 상황을 원하지 않기 때문에 항상 명시 적 검사를 사용합니다. 명시 적으로 허용하십시오 (예 : IsDisposed).

명시 적 검사를 사용하면 개체가 삭제 된 후에 어떤 메서드가 호출 될 수 있는지 명시 적으로 문서화 할 수 있다는 이점이 있습니다. 더 많은 경우 GuardDisposed을 호출하지 않는 메서드의 맨 위에 주석을 추가하면 허용되는 것으로 나타나며 GuardDisposed 또는 주석으로 시작하지 않는 메서드는 의심되는 것으로 간주 될 수 있습니다.

실제로 체크를 구현하려면 별도의 메소드로 이동하여 어설 션과 같이 사용하는 것이 좋습니다.

public class Foo 
{ 
    private bool disposed; 

    public void DoSomething() 
    { 
     GuardDisposed(); 
    } 

    protected void GuardDisposed() 
    { 
     if (disposed) 
      throw new ObjectDisposedException (GetType().Name); 
    } 
} 
0

Dispose() (일반적으로) 메소드에 넣는 코드는 단일 인스턴스에서 esplicitly (및/또는) esplicitly가 아닌 한 번만 호출되지 않도록합니다.

한 번 (DeleteFile, CloseTransaction ...) 실행할 수있는 항목과 생각할 수있는 다른 작업 (앱 도메인에서 두 번 실행해서는 안 됨)을 할 때 사용합니다. .

이렇게 일반적인 경우 : 앱 요구 사항에 따라 다릅니다.

2

이제는 일반적인 방법입니까?

예, 좋습니다. 거의 모든 회원. 클래스가 IDisposable이고 Dispose() 이후에 리소스가 필요한 메서드가 이라면 호출 코드에 심각한 논리 오류가 있습니다. 너의 임무는 이것을 신호하는 것이다.

그러나 소유 한 리소스에 치명적으로 의존하지 않는 메서드 (또는 속성)가있을 수 있으므로 Dispose() 후에도 안전하게 호출 할 수 있다고 간주 될 수 있습니다. 예를 들어 IsOpen 함수/속성입니다. 단순히 false을 반환 할 수 있으며 예외는 필요하지 않습니다.

아니요은 Dispose() 자체에 IsDisposed 체크를 넣어야합니다. 지침은 Dispose()를 여러 번 호출하는 것이 안전해야한다는 것입니다.

이전의 일회용 클래스를 리엔지니어링하고 이러한 검사를 수행해야합니까?

일반적으로 좋은 아이디어입니다. 그것이 노력의 가치가 있는지 여부는 당신에게 달려 있습니다.

+0

나는 이러한 측면을 표현하는 것 '을 참조하십시오 (1)의 경우 메소드는 의미 적으로 * 폐기 된 객체에 대해 * 감각을 줄 것입니다. 배치 된 객체에서 작동해야합니다. IsOpen 예제는 "No, dropped stream is open"이라고 논리적으로 대답 할 수 있기 때문에 좋은 예제입니다. (2) 처분의 목적은 물체가 안전하게 버려지기 전에 (여전히) 일어날 필요가있는 모든 것이 일어나도록 보장하는 것입니다. 아무 것도 일어나지 않으면, 아마도 필요한 모든 것이 이미 발생했기 때문에, 그 조건이 충족되었습니다. – supercat