2010-08-18 2 views
7

파일에서 StreamReader을 만드는 다음의 메서드 GetData가 있습니다.기본 스트림을 삭제하면 XmlReader를 삭제해야합니까?

public XmlDocument LoadDocument(Stream file) 
{ 
    XmlDocument xmldoc = new XmlDocument(); 
    XmlReader xmlread = XmlReader.Create(file); 
    xmldoc.Load(xmlread); 

    return xmldoc; 
} 

StreamReaderGetData으로 배치된다

private void GetData(string file) 
{ 
    string filename = Path.GetFileNameWithoutExtension(file); 
    XmlDocument xmldoc = new XmlDocument(); 

    using (StreamReader sr = new StreamReader(file)) 
    { 
     Stream bs = sr.BaseStream; 
     Stream cl = mainParser.CleanMarkup(bs); 
     try 
     { 
      xmldoc = mainParser.LoadDocument(bs); 
     } 
     catch (XmlException ex) 
     { 
      // Exceptions are usually caused by non-compliant documents. 
      // These errors are not critical to the operation of this program. 
      Console.WriteLine(filename + " " + ex.Message); 
     } 
    } 
    Msdn msdnParser = new Msdn(xmldoc); 

    ListViewItem lvitem = new ListViewItem(filename); 
    lvitem.SubItems.Add(filename); 
    foreach (string item in msdnParser.Subitems) 
    { 
     lvitem.SubItems.Add(item); 
    } 
    listView.Items.Add(lvitem); 
} 

mainParser.LoadDocument(bs)은 다음 호출한다. 이것은 XmlReader을 처리 할 필요가 없다는 뜻인가요? (이것은 믿을만합니다) 유일한 관리되지 않는 리소스를 처리하겠습니까?

답변

6

일하는 가장 좋은 "경험 룰"은 무언가가 IDisposable을 구현하는 경우 using() 블록에 항상 랩핑하여 소유하고있는 관리되지 않는 리소스가 올바르게 폐기되는지 확인하는 것입니다. "무엇인가"의 현재 구현은 기본 자원을 처분 사실에 의존하는 것은

+2

아, 좋은 지적입니다. 이것은 아마도 내가 알고 있어야하는 개념 일 것입니다. 예를 들어 내 얼굴에 나타나면 항상 좋습니다. –

+1

아 답은 C#에만 좋습니다. 대답이 C++/CLI에도 적용될 수 있다면 좋을 것입니다. – user3454439

4

당신 말이 맞아요, 당신은 해야합니다. 그러나 주어진 코드에서는 상처를 입히지 않을 것입니다.

사용 블록을 LoadDocument() 안에 두지 않으려 고합니다. 스트림을 빌려서 (생성하지 않기 때문에) 설계 되었기 때문입니다.

그러나 IDisposable이기 때문에 XmlReader를 Dispose하기위한 인수가 있습니다. Reader (및 Writer) 제품군의 논쟁적인 디자인 때문에 분명히 승자가 있다고 생각하지 않습니다. 분명히 해당 스트림의 소유자가 아니더라도 BaseStream을 삭제합니다.

+0

오프 기준) = 위험 그것은 안전을에있을 단지 하려면 using에 everythig을 포장 해치지 않을 것 내가 읽은 것 중,'XmlReaderSettings'는 기본값이'true' 인'CloseInput' 속성을 가지고 있습니다. 이 기본 동작을 비활성화하여 기본'Stream'을 삭제하지 않고'XmlReader'를 삭제할 수 있습니까? –

+0

내 책이 내게 거짓말했습니다. 'CloseInput'의 기본값은'false'입니다. –

관련 문제