2017-02-14 253 views
1

ストリームを使用してXmlDocumentを作成し、XmlDocumentでいくつかの変更を行い、XmlDocumentをストリーム自体に保存します。XmlDocumentを破棄する方法

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load(fileStream); 

//// 
//// 

//// 
xmlDocument.Save(fileStream); 
//how to dispose the created XmlDocument object. 

ここで、XmlDocumentオブジェクトをどのように破棄できますか?

+0

'xmlDocument = null;'でも、範囲外にすることができます。 GCは残りを行います。 – Fildor

+0

'dispose'は、C#で 'IDisposable'インタフェースに関連する特定の意味を持ちます。これは主に、アンマネージリソースを扱うときに使用されます。しかし、ここではそうではありません。 'XmlDocument'インスタンスへの参照がなくなると、すぐにガベージコレクションの対象となります。 –

答えて

0

XmlDocumentはIDisposableを実装していないため、削除できません。 本当の疑問はなぜオブジェクトを破壊したいのですか?

ガベージコレクタが削除するオブジェクトへの参照を保持しません。

あなたは、プロセスが速くなりたい場合は、あなたが行うことができる唯一のthnigがFildorが言ったように行うことですが、XmlDocumentクラスがIDisposableを実装していないので、それを強制する方法はありません

0

をnullにオブジェクトを設定しますそのリソースを自由に解放する。そのメモリを解放する必要がある場合は、それを行うための唯一の方法はxmlDocument = null;であり、ガベージコレクションは残りの部分を処理します。

1

まず、このようなストリームを再利用するべきではありません。あなたは本当に長い間外部リソースを開いたままにしますか?そしてあなたはxmlを再保存する前にストリームを探しますか?以前より短い場合は、保存後にストリームを切り捨てますか?

答えが真であるいくつかの正当な理由のために、代わりにXMLマニピュレータクラスは使い捨てにする場合:

public class MyXmlManipulator : IDisposable 
{ 
    private FileStream fileStream; 

    // ... 

    public void ManipulateXml() 
    { 
     // your original codes here... 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    ~MyXmlManipulator() 
    { 
     Dispose(false); 
    } 

    protected virtual Dispose(bool disposing) 
    { 
     fileStream.Close(); 
     // etc... 
    } 
} 

しかし、基本的に私は、ファイルストリームと再利用への長い生活の参照を保持していないと言うでしょうそれはそのようなものです。ストリームをローカルで使用し、できるだけ早く廃棄してください。ここでグローバルに必要となるのはファイル名だけです。

public class MyXmlManipulator 
{ 
    private string fileName; 

    // ... 

    public void ManipulateXml() 
    { 
     XmlDocument xmlDocument = new XmlDocument(); 
     using (var fs = new FileStream(fileName, FileMode.Open) 
     { 
      xmlDocument.Load(fs); 
     } 

     // ... 

     // FileMode.Create will overwrite the file. No seek and truncate is needed. 
     using (var fs = new FileStream(fileName, FileMode.Create) 
     { 
      xmlDocument.Save(fs); 
     } 
    } 
} 
関連する問題