2009-04-15 8 views
0

C# 프로그램의 using 블록에 코드를 추가하려고합니다. 이전에 기존 코드 본문에 독립 실행 형이었던 내 응용 프로그램을 채우는 일종의 일이기 때문에 제대로 맞히기 위해 약간 어지러운 작업을 수행해야합니다.C# 정적 개체에서 블록 사용 사용

public class WrapperForMyOldApp 
{ 

    public static ItemThatINeed item1; 
    public static ItemThatINeed item2; 

    public WrapperForMyOldApp() 
    { 
     item1 = new ItemThatINeed(); 
     item2 = new ItemThatINeed(); 
    } 

    public static go() 
    { 
     // some stuff that i need to do with items 1 and 2 
    } 
} 

public class MainProgram 
{ 
    . 
    . 
    . 

    public void MethodThatNeedsToMakeUseOfMyApp() 
    { 
     .... 
     using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp()) 
     { 
      WrapperForMyOldApp.go(); 
     } 
    } 
} 

좋아, 그래서 여기에 질문은 : 그것은 무엇처럼 보이는 끝나는 것은 다음과 같은 것입니다 지금 악영향 클래스 메인 프로 그램에 영향을 수있는 사용하여 블록 및/또는 만든 특이한 부작용의 효과를 무력화 되세요 ? 나는 Wrapper 객체와 그 내용이 Disposed 될 것이고 실행은 예상대로 계속 될 것이지만 내가 간과하고 있다는 것을 알아야 할 필요가있는 것은 무엇인가?

감사합니다.

답변

5

이 기능을 사용하려면 WrapperForMyOldApp에 IDisposable을 구현해야합니다.

WrapperForMyOldApp의 Dispose() 호출은 정리를 수행합니다.

그러나 정적 개체는 일반적으로 단일 개체를 초과하는 수명을 가진 개체에 사용됩니다. 일반적으로이 유형의 사용법에서는 ItemThatINeed 인스턴스를 정적이 아니게 만들고 WrapperForMyOldApp 생성자에서 생성 한 다음 WrapperForMyOldApp.Dispose()에서 정리합니다.

정적 개체를 사용하면 악몽이 생길 수 있습니다. 개체를 구성한 다음 (사용 블록의 끝에서) 정리를 수행한다고 말하면 Dispose() 메서드가 정적 객체를 정리합니다. 그러나 다시 사용하게되면 어떻게 될까요? 2 개의 WrapperForMyOldApp 인스턴스를 2 개의 스레드로 작성하면 올바른 동작은 무엇입니까? 결정 론적 정리를 원할 경우 이러한 문제를 고려할 것입니다.

+0

매우 도움이됩니다. 감사합니다. –

6

래퍼 클래스가 IDisposable을 구현하고 있는데 표시하지 않았습니까? 일회용이 아니라면 using 문을 전혀 사용할 필요가 없습니다.

1

WrapperForMyOldAppIDisposable을 구현하고 Dispose() 구현을 통해 리소스를 제거 할 수 있다면 작동해야하지만 다른 부작용이있을 수 있습니다. 이 코드는 문화권 등 전역 (정적) 상태를 변경할 수 있습니다. 스레드를 생성 할 수 있습니다. 모든 종류의 것들.

나쁜 접근 방식은 아니지만, Dispose()이 유용 할 수 있는지를 알기 위해 을 캡슐화하는 코드를 알아야합니다.