6

コーディングがオブジェクトの正しい処理に従うようにしようとしているので、これらのルールをエラーとして適用しています。しかし、コードのこのセクションに問題があります

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;

class MyClass
{  
    public String ToXml()
    {
        var objSerializer = 
            new DataContractSerializer(GetType());
        var objStream = new MemoryStream();
        StreamReader objReader;

        String strResult;
        try
        {
            // Serialize the object
            objSerializer.WriteObject(objStream, this);

            // Move to start of stream to read out contents
            objStream.Seek(0, SeekOrigin.Begin);

            objReader = new StreamReader(objStream);

            try
            {
                // Read Contents into a string
                strResult = objReader.ReadToEnd();
            }
            finally
            {
                objReader.Dispose();
            }
        }
        finally
        {
            if (objStream != null)
            {
                // objStream.Dispose();
            }
        }

        return strResult;
    }
}

コメントアウトするobjStream.Dispose()と、オブジェクトを破棄していないため CA2000 が表示されますが、コメントを削除すると、複数回破棄していると表示されます。

他に何がオブジェクトを破棄していますか? または、複数のストリームを扱うときにこれを間違っているだけですか?

4

3 に答える 3

1

StreamReader を破棄すると、基になるストリームも破棄されます。

objStream.Dispose() をコメントアウトすると、ネストされた try ブロックに到達する前に何かが例外をスローする可能性があり、その結果、ストリームが破棄されなくなります。

ここに良い説明があります: ストリームリーダーを破棄するとストリームが閉じますか?

于 2012-04-13T11:17:28.097 に答える
0

これは答えではありませんが、次のコードの方が読みやすいかもしれません。

public String ToXml()
{
    var objSerializer =
        new DataContractSerializer(GetType());

    using (var objStream = new MemoryStream())
    {
        //  Serialize the object
        objSerializer.WriteObject(objStream, this);

        // Move to start of stream to read 
        // out contents
        objStream.Seek(0, SeekOrigin.Begin);

        using (var objReader =
            new StreamReader(objStream))
        {
            // Read Contents into a string
            retirm objReader.ReadToEnd();
        }
    }
}
于 2012-04-13T11:20:27.270 に答える