-1

たとえば、のusing代わりにメソッドを使用するFileStream.Close();と、クラスは正しく破棄されますか?

private static string GetString()
{
    using(FileStream fs = new FileStream("path", FileMode.Open))
    using(StreamReader sr = new StreamReader(fs))
    {
         return sr.ReadToEnd();
    }
}

と同等です:

private static string GetString()
{
    string toReturn = "";           

    FileStream fs = new FileStream("path", FileMode.Open)
    StreamReader sr = new StreamReader(fs)

    toReturn = sr.ReadToEnd();

    sr.Close();
    fs.Close();

    return toReturn;
}

または:

private static string GetString()
{
    FileStream fs;
    StreamReader sr;

    try
    {
        string toReturn = "";          

        fs = new FileStream("path", FileMode.Open)
        sr = new StreamReader(fs)

        toReturn = sr.ReadToEnd();

        sr.Close();
        fs.Close();

        return toReturn;
    }
    finally
    {
       if(sr != null)
           sr.Close();

       if(fs != null)
           fs.Close();
    }
}
4

3 に答える 3

2

ステートメントから生成されたコードはusing、2番目の例と非常によく似ています(最大の違いは、のIDisposable.Dispose代わりにを呼び出すことですClose)。returnメソッドが例外またはスローされた例外によって終了するかどうかに関係なく、オブジェクトは常に適切に処理されます。

気になる方のために説明すると、これはsを含まないC#コードであり、usingsを使用した例と同じILにコンパイルされますusing

private static string GetString()
{
    FileStream fs = new FileStream("path", FileMode.Open);
    try
    {
        StreamReader sr = new StreamReader(fs);
        try
        {
            return sr.ReadToEnd();
        }
        finally
        {
            if (sr != null)
                ((IDisposable)sr).Dispose();
        }
    }
    finally
    {
        if (fs != null)
            ((IDisposable)fs).Dispose();
    }
}
于 2012-09-29T16:28:41.443 に答える
1

見てusingください:

http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx

これは次と同等である必要があります。

FileStream fs = null;

try
{
    fs = new FileStream("path", FileMode.Open);
    StreamReader sr = null;
    try
    {
        sr = new StreamReader(fs);
        toReturn = sr.ReadToEnd();
        return toReturn;
    }
    finally
    {
       if(sr != null)
           sr.Dispose();
    }
}
finally
{
    if(fs != null)
        fs.Dispose();
}

メソッド内では、 streamDisposeを呼び出します。Close

于 2012-09-29T16:34:44.157 に答える
0

実装されIDisposableている場合、usingブロックが終了すると適切に閉じられます。

于 2012-09-29T16:24:18.140 に答える