2010-07-09 8 views
3

일반적으로 스트림을 사용하여 명령문을 작성하면 스트림을 올바르게 처리 할 수 ​​있으므로 사용하지 않을 때 실수로 호출하지 않습니다. 블록. 여기C 배열의 스트림 배열

몇 가지 예 : MSDN using Statement Reference

어떻게 하나 스트림의 배열과 함께 사용하여 문을 사용합니까? try/catch/finally 블록 외부에서 배열을 선언하고 finally 블록에서 각 스트림의 dispose 메서드를 호출하는 것과 동일합니까?

마지막으로 스트림이 제대로 처리되었는지 테스트하는 방법은 무엇입니까?

+0

사이드 노트와 마찬가지로 ... 스트림을 교차하지 마세요! –

답변

5

스트림이 들어있는 새 객체를 만들 것입니다. 이런 식으로 뭔가 (완전히 구체화되지 않음) :

class StreamHolder : IDisposable 
{ 
    List<Stream> Streams {get;} 

    public void Dispose() 
    { 
     Streams.ForEach(x=>x.Dispose()): 
    } 
} 

당신이 using 한 Statment에 컨테이너 개체를 넣을 수 있습니다이 방법, 그것은 당신을위한 스트림 처리를 처리 할 것입니다. 다른 옵션은 finally 블록에서 처리하는 것이지만, 한 곳에서이 작업을 수행하려는 경우이를 캡슐화하고 싶습니다. 따라서 완료 될 때 실수로 모든 스트림을 처리하는 것을 잊지 마십시오. .

+2

괜찮습니다. 너무 구체적입니다. IEnumerable로 초기화되는 일반적인 EnumerableDisposer를 만들지 않아도됩니다. 이 시점에서 anon 메서드를 변경하여 IDisposable에 'as'로 캐스팅하고 null이 아닌 경우 Dispose를 호출해야합니다. 나는 과거에 이것을 정확하게했으며, 잘 작동합니다. –

+0

좋은 지적입니다. – kemiller2002

+0

감사합니다. 확실히 스트림의 무효를 검사해야하지만, 이것은 내가 찾고있는 솔루션의 라인을 따라 더 많은 것입니다. – scott

3

usingusing을 사용하지 않고 수행해야합니다.

이것은 배열을 반복하고 각 인스턴스에 Dispose을 호출하는 것을 의미합니다 (필요한 경우 IDisposable으로 명시 적으로 캐스트 한 후). finally 블록에서 해당 루프를 수행하십시오.

마지막으로 제대로 처리되지 않았는지 테스트합니다. 일단 Dispose를 호출하면 더 이상 사용할 수 없기 때문에 폐기해야합니다.

2

using() 문은 좋은 습관을 다시 갖도록 의도 된 처리 패턴이지만 필수는 아닙니다. 범위가 지정된 함수의 수명이 다 된 시점에서 객체를 저장해야하는 경우가 많이 있습니다.

using() 문을 사용할 수있는 방법으로 설계해야한다고 생각하지만 필수적인 것은 finally 블록을 encopassing하는 경우 각 스트림을 처리한다는 것입니다.

마지막 질문에 대답하기 위해 Stream 클래스에는 IDisposable 패턴이 올바르게 구현 된 경우 닫히거나 삭제되었는지 여부를 확인하는 데 필요한 메서드 나 속성이없는 것으로 나타나지만 다음과 같은 경우 다시 Close/Dispose를 호출 할 수 있습니다. 당신은 확신해야합니다.

+0

Dispose에 대한 추가 호출은 무해해야하지만 다른 메소드를 호출해도 예외가 발생할 가능성이 높으므로 첫 번째 호출 후에 참조를 null로 만들지 않아도됩니다. 어쨌든, +1은 그가 '사용'을 허용하기 위해 그것을 바꿀 것을 제안합니다. 나는 이것을하기 전에 IEnumerable에서 초기화되는 일반 Disposer 객체를 사용하고 자체 Dispose에서 각 요소를 IDisposable로 캐스팅하여 성공시 Dispose를 호출 할 수 있도록합니다. –