代码段如下

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


据我所知,如果类包含IDisposable的字段,则它应该自己实现IDisposable并照顾拥有对象的处置,因此在这种假设下,在处置streamWriter之后,也将处置gZipOutputStream和memoryStream。但是我们仍然不需要配置memoryStream在它上面调用toArray()方法。
因此,问题是,在最后的memoryStream上调用ToArray()方法是否安全?

最佳答案

如果我正确理解了您的问题,则表示您正在处置ToArray()后,是否可以安全地在MemoryStream上调用MemoryStream

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


  当closed关闭时,此方法有效。


编辑:并且,如果不清楚disposed是否也表示Dispose,您还可以在source code中查看Stream.Dispose()方法(注意:链接是MemoryStream,因为Dispose并不覆盖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();
}


如您所见,调用Close()只是调用。

关于c# - 多次使用块,此代码安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39145436/

10-15 21:35