2011-08-01 2 views
2

스트림 내에서 스트림 배치 - 래핑 된 스트림이 올바르게 배치됩니까?

또는 GZipStream 또는 다른 스트림으로 변환하면 ... 첫 번째 예제는 모든 밑받침 스트림을 처리합니까?

마지막으로 나에게 충격을주었습니다. Stream 클래스를 직접 구현했습니다.

class MyStream : Stream 
{ 
    // fake stream implementation 

    protected override void Dispose(bool disposing) 
    { 
     Console.WriteLine("disposing in my class"); 
     base.Dispose(disposing); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyStream stream = new MyStream(); 
     DoSomething(stream); 
     stream.Dispose(); 

     Console.WriteLine("end of program"); 
    } 

    private static void DoSomething(Stream stream) 
    { 
     using (var writer = new StreamWriter(stream)) 
     { 
      Console.WriteLine("inside using statement"); 
     } 

     Console.WriteLine("after writing"); 
    } 
} 

결과 :

inside using statement 
disposing in my class 
after writing 
disposing in my class 
end of program 

답변

2

상단 가장 스트림 폭포에 가까운 호출을 아래로 내려 가고 모두 닫을 것이지만, 열리는 것과하지 않는 것에 관해 계속 열심히하기 때문에 이것은 권장하지 않습니다. 다른 응답자가 말했듯이, 사용하는 블록을 종교적으로 사용하십시오.

희망이 도움이됩니다.

2

아니요. 어떤 IDisposable 개체에 대해서도 기본 스트림을 삭제할 수는 없습니다 (StreamWriter의 경우 그렇게 명시되어 있지만). 일반적으로 그것에 의존하지 마십시오.

중첩 된 사용 문을 사용해야합니다.

+0

downvoter .... 왜? 내가 말한 것은 정확하다. IDisposable을 구현하는 객체에 * 의존하지 말아야한다. 모든 멤버/매개 변수 IDisposable 객체에 Dispose를 호출한다. –

+0

글쎄요, 클래스를 래핑하지 않아도 충돌을 일으킬 수 없다는 것을 말하는 것과 같습니다. 끊임없이 행동하는 데 의존 할 수없는 프레임 워크를 사용하는 이유는 무엇입니까? – argh

+0

그의 예제에서 사용 된 클래스의 경우에는 괜찮습니다.하지만 OP가 의미를 가지면 IDisposable 개체의 모든 조합에 문제가 없으므로 문제가 발생합니다. –

2

여기서 두 가지 개념을 혼합합니다.

주 블록은 블록을 사용하여 중첩되어 있으며 두 번째 샘플에서는 올바르게 사용하고 있습니다.

두 번째 문제점은 중첩/랩핑/링크 된 일회용 클래스입니다. StreamWriter 및 Stream의 경우 작성기는 스트림을 닫습니다. 그러나 당신은 그것을 알고 싶지 않습니다. 단지 사용 패턴을 사용하십시오.

작은 팁으로 다음 대체 레이아웃을 읽고 유지하는 것이 더 쉽습니다. GZipStream을 추가하면 블록을 사용하여 3 개 이상 중첩됩니다.

using (var stream1 = File.Create(...)) 
using (var stream2 = new StreamWriter(stream1)) 
{  
     stream2.Write(""); 
} 
+0

일반적으로 나는 이것에 동의한다. 당신은 "지식의 의존성"을 피해야 만하지만,이 경우에도 문서화되어 있기 때문에 내부 스트림 객체를 처리하지 않는 것이 안전하다. –

+0

@Lasse correct하지만 어쨌든 그것을 피하는 경향이 있습니다. 작성자 다음에 스트림을 사용하는 것과 같은 적절한 상황을 제외하고. –

+0

나는이 특별한 경우에 그것이 중요하지 않을 것이라는 것을 "알고있다"고해도 나는 항상 이것과 같이 처분한다. 나는 여전히 그렇게한다. 필자는이 코드 라인을 "최적화"하고 싶기 때문에 저와 동료 개발자가 제 코드를 따라 가고 "이상하게 생각합니다."라고 생각하지 않습니다. –