多个使用块,这段代码安全吗?

时间:2016-08-25 12:32:53

标签: c# .net .net-4.0 using idisposable

代码段如下

 public static string ToCompressedBase64(this string text)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gZipOutputStream = new GZipStream(memoryStream, CompressionMode.Compress))
            {
                using (var streamWriter = new StreamWriter(gZipOutputStream))
                {
                    streamWriter.Write(text);
                }
            }
            return Convert.ToBase64String(memoryStream.ToArray());
        }
    }

据我所知,如果class包含IDisposable字段,那么它应该实现IDisposable本身并负责处理拥有的对象,因此在这个假设下,在处理streamWriter后,gZipOutputStream和memoryStream也将被处理掉。但是我们仍然不需要处理memoryStream来调用它上面的toArray()方法 所以问题是,最后在memoryStream上调用ToArray()方法是否安全?

1 个答案:

答案 0 :(得分:6)

如果我正确理解了您的问题,那么您询问在ToArray()处理完MemoryStream后是否安全。

如果是的话,那么是的,这是安全的。 documentation指定:

  

此方法在MemoryStream关闭时有效。

编辑:如果不清楚closed是否也意味着disposed,您还可以查看Dispose的{​​{3}}方法(注意:链接指向Stream.Dispose(),因为MemoryStream未覆盖Dispose方法):

public void Dispose()
{
    /* These are correct, but we'd have to fix PipeStream & NetworkStream very carefully.
    Contract.Ensures(CanRead == false);
    Contract.Ensures(CanWrite == false);
    Contract.Ensures(CanSeek == false);
    */

    Close();
}

正如您所看到的,调用Dispose()只会调用Close()