-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与您的第二个示例非常相似(最大的区别是它调用IDisposable.Dispose而不是Close)。return无论方法是通过异常退出还是抛出异常,它都会正确处理对象。

如果您好奇,这是不带usings 的 C# 代码,它编译为与带 s 的示例相同的 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();
}

Dispose方法内部,它将调用Close流。

于 2012-09-29T16:34:44.157 回答
0

如果它实现IDisposable了,它将在退出 using 块时正确关闭。

于 2012-09-29T16:24:18.140 回答