从正确处理的方法返回对象?

时间:2012-09-29 16:19:38

标签: c# .net idisposable using-statement try-finally

如果您使用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();
    }
}

3 个答案:

答案 0 :(得分:2)

using语句生成的代码与您的第二个示例非常相似(最大的区别是它调用IDisposable.Dispose而不是Close)。它总是会正确处理对象,无论方法是通过return还是抛出异常退出。

如果您感到好奇,这是没有using的C#代码,它编译为与using s的示例相同的IL:

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();
    }
}

答案 1 :(得分: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();
}

Dispose方法内,它会调用Close stream。

答案 2 :(得分:0)

如果它实现IDisposable,则在退出使用块时将正确关闭它。