2010-08-18 15 views
7

Ben bir dosyadan StreamReader oluşturur aşağıdaki yöntemi GetData var.Temel Akışını Tasfiye Edersem XmlReader'ı İmha Etmem Gerekir mi?

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

    return xmldoc; 
} 

StreamReaderGetData tarafından elden:

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) aşağıdaki çağırır. Bu, XmlReader'u imha etmek zorunda olmadığım anlamına gelir (bu, inanıyorum), bunun tek yönetilmeyen kaynağını bertaraf edeceğinden?

cevap

6

Çalışacak en iyi "başparmak kuralı", eğer bir şey IDisposable uygularsa, sahip olduğu yönetilmeyen kaynakların doğru şekilde atıldığından emin olmak için her zaman using() bloğuna sarın. "Bir şey" akım uygulama altta yatan bir kaynağı yok eden gerçeğine dayanarak

+2

Ahh, bu iyi bir nokta. Bu muhtemelen farkında olmam gereken bir kavramdır. Yüzümde bir örnek belirdiğinde her zaman güzel olur. –

+1

Ah cevap sadece C# için iyidir. Cevabın C++/CLI'ye bile uygulanabilmesi güzel olurdu. – user3454439

4

Haklısın, sen okuyucu imha gerekmez. Ama verilen kodda, bu da zarar vermez.

LoadDocument()'un içine bir blok yerleştirmeyeceğim, çünkü akışını 'ödünç alsın' olacak şekilde tasarlanmıştır (onu oluşturmaz).

Ama argümanlar o ıdisposable sırf Neyse XmlReader imha etmek vardır. Okuyucu (ve Yazar) ailesinin tartışmalı tasarımı nedeniyle burada net bir kazanan olduğunu düşünmüyorum: Tabii ki, bu akışların sahibi olmaksızın onların tabanlarını elden çıkarırlar.

+0

kapalı göre) = tehlikelidir ve güvenli tarafta olmak sadece için, bir using yılında everythig sarmak için zarar vermez Okuduğum şeyin, 'XmlReaderSettings',' true' için varsayılan bir '' CloseInput'' özelliği taşıyor. Bu varsayılan davranışı devre dışı bırakmayı düşünürsem, bu yüzden "XmlReader" ın altında yatan "Akışı" imha etmeden kullanabilirim? –

+0

Kitabım bana yalan söyledi. 'CloseInput' için varsayılan değer 'false'. –

İlgili konular