다음과 같은 코드를 생각해 한편으로라이터가 삭제 될 때 스트림이 처리되는 이유는 무엇입니까?
using (var ms = new MemoryStream())
{
using(var writer = BinaryWriter(ms))
{
writer.Write(/*something*/);
writer.Flush();
}
Assert.That(ms.Length > 0); // Throws ObjectDisposedException
}
를, 그것의 자원을 처분해야 일회용 객체; 나는 그것을 얻는다. 그러나 다른 한편으로, 객체는 생성되지 않았고이 자원을 소유하지 않았다. 그것은 제공되었다 -> 호출 코드는 그것을 책임 져야한다 ... 안돼?
은이 같은 다른 상황을 생각할 수 없다,하지만 자신의 처분에 폐기하는 일회용 객체를 수신하는 모든 클래스에 대한 프레임 워크에서 일관된 패턴이다?
개체는 소유하지 않은 물건을 처리해서는 안됩니다. 객체를 직접 인스턴스화하는 것 이외의 객체 소유권을 획득하는 것이 가능합니다 (가장 일반적으로는 팩토리 메소드 호출). 팩토리 메서드는 일반적으로 단일 개체 만 반환하기 때문에 메서드에서 얻은 모든 리소스는 해당 개체가 소유해야합니다. 'StreamWriter'가 전달 된 스트림의 소유권을 갖게되면 팩토리 메소드가 합법적으로 스트림을 구성하고 그것을 캡슐화하는'StreamWriter'를 리턴 할 수 있습니다. – supercat
@ supercat eh no. 나는 너에게 동의한다. "물건은 물건을 처분해서는 안된다." 그것은 그것을 말하는 올바른 방법입니다. 그러나,이 경우가 아닙니다. StreamWriter 클래스 자체를 설계하면 호출자가 스트림을 어떻게 처리하는지 알 수 없으며 스트림을 처리 할 수도 없습니다. 여러 리더에서 스트림을 사용하는 경우를 고려하십시오. 그런 다음 그것을 처리 할 것인지에 따라 문을 사용하여 조건부로 StreamReader를 래핑해야합니까? IDisposable은 성명서를 사용하여 왜곡되어야합니다. 질문이 없습니다. –
올바른 접근법은 호출자가 소유권이 이전되었는지 (.NET Framework의 이후 버전에서 수행되는지)를 지정하도록 허용하는'StreamReader' /'StreamWriter'의 생성자를위한 것입니다. 그렇지 않으면,'StreamReader' 형태로 가져온 오디오 데이터를 비동기 적으로 재생할 방법을 작성하는 방법을 고려하십시오. 오디오를 재생하는 코드는 기본 스트림에 대해 아무 것도 모를 수 있으며 'StreamReader'를 구성하는 코드는 재생 코드가 끝날 때 전혀 알 수 없습니다. 스트림이 순수하게 오디오 재생 목적으로 열리는 일반적인 경우에는 ... – supercat