문제

나는 쓸 방법에 스트림을 보내고 있으며, 그 방법에서는 이진 리더/wrtier를 사용하고 있습니다. 독자/작가가 처분되면 using 또는 그것이 참조되지 않은 경우, 스트림도 닫혀 있습니까 ??

바이너리 리더/작가를 보내지 만 스트리트 리더도 사용하고 있습니다 (아마도 그 주위를 가야 할 수도 있습니다. getline 및 readline에만 사용하고 있습니다). 작가/독자가 문을 닫을 때마다 스트림을 닫으면 이것은 매우 번거 롭습니다.

도움이 되었습니까?

해결책

예, StreamReader, StreamWriter, BinaryReader 그리고 BinaryWriter 전화 할 때 모두 근본적인 스트림을 폐기/처분합니다. Dispose 그들에게. 그들 ~하지 않다 독자/작가가 단지 수집 된 쓰레기 인 경우 스트림 폐기 - 독자/작가를 항상 처분해야합니다. using 성명. (사실,이 클래스 중 어느 것도 최종화 업체도없고 가지고 있지 않아야합니다.)

개인적으로 나는 스트림에 대한 사용 명세서를 선호합니다. 당신은 둥지를 둘 수 있습니다 using 브레이스가없는 진술은 아주 깔끔하게 :

using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}

비록 using 스트림에 대한 진술은 다소 중복됩니다 ( StreamReader 생성자는 예외를 던졌습니다.) 나는 당신이 그때 당신이 StreamReader 그리고 나중에 스트림을 직접 사용하면 이미 올바른 처분 의미론이 있습니다.

다른 팁

이것은 오래된 것이지만 오늘 비슷한 일을하고 싶었고 상황이 바뀌 었다는 것을 알았습니다. .NET 4.5 이후 a가 있습니다 leaveOpen 논쟁:

public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )

유일한 문제는 다른 매개 변수에 대해 무엇을 설정 해야하는지 완전히 분명하지 않다는 것입니다. 다음은 도움이 있습니다.

에서 MSDN 페이지 StreamReader 생성자 (Stream)의 경우 :

이 생성자는 utf8encoding에 대한 인코딩, 스트림 매개 변수를 사용하여 Basestream 특성 및 내부 버퍼 크기를 1024 바이트로 초기화합니다.

그냥 떠난다 detectEncodingFromByteOrderMarks 판단 소스 코드 ~이다 true

public StreamReader(Stream stream)
        : this(stream, true) {
}

public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
        : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}

이러한 기본값 중 일부가 노출되거나 인수가 선택 사항이므로 원하는 것이 좋을 경우는 좋을 것입니다.

예, 그렇습니다. 리플렉터로 구현을 보면이를 확인할 수 있습니다.

protected override void Dispose(bool disposing)
{
    try
    {
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {    
            this.stream = null;    
            this.encoding = null;
            this.decoder = null;
            this.byteBuffer = null;
            this.charBuffer = null;
            this.charPos = 0;
            this.charLen = 0;
            base.Dispose(disposing);
        }
    }
}

6 년 늦었지만 아마도 누군가가 누군가를 도울 수 있습니다.

StreamReader는 폐기 될 때 연결을 닫습니다. 그러나 Streamreader/streamWriter와 함께 "사용 (스트림 스트림 = ...) {...}"를 사용하여 스트림이 두 번 배치 될 수 있습니다. 닫힙니다. 이로 인해 VS의 코드 분석을 실행할 때 CA2202 경고가 발생합니다.

다른 솔루션에서 직접 가져온 다른 솔루션 CA2202 페이지는 시도/마침내 블록을 사용하는 것입니다. 올바르게 설정하면 연결이 한 번만 닫습니다.

바닥 근처 CA2202, Microsoft는 다음을 사용하는 것이 좋습니다.

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}

대신에...

// Generates a CA2202 warning
using (Stream stream = new FileStream("file.txt", FileMode.Open))
using (XmlReader reader = new XmlReader (stream))
{
    // Use the reader object...
}

예. dispose () on 및 idisposable ( "사용")을 호출하면 객체가 모든 자원을 정리해야합니다. 여기에는 스트림에 플러싱 및 파일 설명자를 닫는 것이 포함됩니다.

귀하의 경우 다른 방법으로 전달하려면 해당 메소드가 사용 블록으로 읽기/쓰기를 수행하지 않도록해야합니다.

필요한 경우이를 해결하는 쉬운 방법은 Streamwriter 클래스 Dispose 메소드를 무시하는 것입니다. 수행 방법에 대한 코드는 여기 내 게시물을 참조하십시오.

스트림 라이터가 기본 스트림을 닫습니까?

"사용"키워드 또는 명시 적으로 처분하여 호출하여 폐기 된 스트림

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top