私はIDisposableを実装するクラスを使用して、usingステートメントを使ってブロックをストリームに書き出しました。これは、正しいネストを維持し、開始/終了部分の欠落または間違った配置を避けるために役立ちます。C#で(コード例)(XMLなどの)コードブロックを書くために(IDisposable obj = new ...)を使用
基本的に、コンストラクタは、ブロックの開始(例えばXMLタグを開く)、Dispose()を終了(例えば、終了XMLタグ)する。例は以下のUsableXmlElementです(大規模なXMLの場合、LINQ to XMLまたはメモリ内のXmlDocumentはオプションではありません)。
ただし、これらのIDisposableは、Microsoftが推奨する洗練されたパターン、Destructor/Finalizer、別のDispose(bool)メソッド、GC.SuppressFinalize()を実装していません。 Disposeは単にend要素を書きます。それだけです。
これには欠点がありますか、これは要素の正しい入れ子を維持するための良い方法ですか?
class UsableXmlElement : IDisposable
{
private XmlWriter _xwriter;
public UsableXmlElement(string name, XmlWriter xmlWriter)
{
_xwriter = xmlWriter;
_xwriter.WriteStartElement(name);
}
public void WriteAttribute<T>(string name, T value)
{
_xwriter.WriteStartAttribute(name);
_xwriter.WriteValue(value);
_xwriter.WriteEndAttribute();
}
public void WriteValue<T>(T value)
{
_xwriter.WriteValue(value);
}
public void Dispose()
{
_xwriter.WriteEndElement();
}
}
使い方は次のようである:
<RootElement DocVersion="123">
<InnerElement>
<!-- anything -->
</InnerElement>
</RootElement>
なぜそれが問題になるはずですか?あなたはUsableXmlElement内のアンマネージドリソースを取得しないので、ファイナライザは必要ありません。私はそう思います... – user1096188
ああ、あなたはWriteValueとWriteAttributeが汎用である必要はありません。 _xwriter.WriteValueは常にオブジェクトパラメータで呼び出されるため、何もしません。 – user1096188
ハムムーム........ – code4life