2009-12-29 26 views
6

일부 사용자 정의 클래스와 상호 작용할 필요가있는 .NET 프로젝트를 작업 중입니다. "작업"으로 언급되어 있습니다. 모든 작업 클래스는 라이브러리가 소비하기 위해 특정 인터페이스 IJob을 구현해야합니다. 때로는 작업 클래스가 관리되지 않는 자원을 보유 할 수 있으며 명시 적으로 처리해야합니다.일회용 물건을 어떻게 처리해야합니까?

작업에 명시 적 처분이 필요한지 미리 알 수없는 경우 어떻게 사용 후 모든 작업이 적절히 처리되도록해야합니까? 나는 몇 가지 아이디어를 자신을 가지고 있지만, 귀하의 의견/제안을 듣고 싶습니다 :

  1. Dispose() 방법을 구현하기 위해 모든 작업을 강제로 IJob : IDisposable을 확인합니다. 이렇게하면 using 블록의 작업을 처리 할 수 ​​있지만 대부분의 작업은 이 아니기 때문에 명시 적 처리가 필요할 것으로 예상되므로은 클라이언트 개발자에게 불필요한 혼동을 일으킬 수 있습니다.

  2. try-finally 블록 작업과 관련된 모든 작업을 수행하고, 작업이 IDisposable을 구현하는 경우 Dispose()가 호출 될 수 있도록 finally를 사용합니다. 이렇게하면 빈 Dispose() 메소드를 구현하지 않아도 클라이언트가 새로운 작업 클래스를 쉽게 구현할 수 있지만 라이브러리가 일회용 작업을 알고 걱정하는 사실도 숨 깁니다. 이것을 작성 후

, 나는 솔루션 # 1 향하다하는 경향이있다,하지만 난 여전히 다른 솔루션을 볼 좋을 것이다 생각하고, 추가 프로/두에 단점은 이미 염두에두고있다.

답변

8

에 동의 같은 조언 (제공 읽을 경우 : 스트림의 기본 클래스 따라서 모든 스트림 후손으로 IDisposable NAD입니다 . 하지만 MemoryStream은 Disposing이 필요하지 않습니다.
하지만 try/finally를 목표로 삼지 마십시오. using() { } 블록은보다 편리한 속기입니다.

그래서 선택하십시오 : 모든 작업을 IDisposable 또는 일부만 원하십니까?

첫 번째 옵션은 작은 오버 헤드가 발생하고 두 번째 옵션은 필요한 경우 Dispose (사용)를 잊어 버리는 것이 더 쉬워집니다.

+0

좋은 지적. 그러나 대부분의 하천은 처분이 필요하며 소수의 일자리에서만 필요하다고 생각합니다. –

+0

'System.Web.IHttpModule'은 구현 자에게 (Dispose()) 메소드를 제공 할 것을 요구합니다. 단 몇 개의 모듈 (IMHO) 만 필요합니다. 나는 이것이 # 1에 대한 우선 순위를 제공한다고 생각합니다. –

+1

+1, 나는 또한 Job이 사용했던 것을 정리하는 표준화 된 방법을 제공하는 것이 이치에 맞다고 생각한다. 'IDisposable'을 사용하면 프레임 워크 지원의 혜택을 볼 수 있으며 최종 사용자는 적절한 정리 코드를 어디에 두어야하는지 생각하면 도움이됩니다. – user7116

2

나는 # 2와 함께 가고 모든 일회용 물체가 폐기 될 것이라는 점을 설명 할 것입니다. 기본적으로 개체의 소유권을 가져 오는 경우 IDisposable을 구현하는 개체를 처분해야합니다.

당신은 효과적인 C는 #/더 효과적인 C 번호는 빌 와그너가 난 전례가 분명히 ;-)

+0

를, 그래서이 옵션 # 2에 대한 인수가 표시되지 않습니다. –

3

이런 식으로 생각합니다. 차라리 개발자가 필요한 Dispose 메서드를 구현하는 것을 잊는 것보다 빈 Dispose 메서드를 구현하고 싶습니다.

5

# 2는 foreach 구조가 작동하는 방식입니다. 또한 Autofac의 컨테이너 처리 방법도 마찬가지입니다.

의미 론적 차이

는 작업 자체 일회용 것을, 또는 구현 일회용 수 있습니다 여부를 말할 여부입니다.

이전 예제는 사실이 아니며 작업이 본질적으로 일회용이 아니라는 점은 분명합니다.따라서, 나는 # 2를 추천하지만, 확장 방법으로 try/finally을 중앙 집중화 : 영업 이익은 이미 두 옵션 모두에서 소유 한 객체를 폐기한다

public static void Execute(this IJob job) 
{ 
    try 
    { 
     job.Run(); 
    } 
    finally 
    { 
     var disposableJob = job as IDisposable; 

     if(disposableJob != null) 
     { 
      disposableJob.Dispose(); 
     } 
    } 
} 
+0

+1, 나는 의미론에 대한 당신의 주장을 좋아하지만, 나는 다른 해결책들과 질문 자체에서 언급 된 이유들 때문에 첫 번째 해결책으로 갈 것이라고 생각한다. –

관련 문제