我正在向要写入的方法发送一个流,在这些方法中我使用的是二进制阅读器/ wrtier.当读取器/写入器被处理时,using或者仅在未被引用时,流也被关闭?
我会发送一个BinaryReader/Writer,但我也在使用StreamReader(也许我应该绕过它.我只使用GetLine和ReadLine).如果每次作家/读者关闭时关闭流,这是非常麻烦的.
我最近下载了Visual Studio 2013,并在我正在处理的项目上运行了代码分析.它引发了一些我正在解决的问题,但其中一个特别是关于我如何使用"使用"IDisposable语句.
这是我的代码示例:
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我理解分析警告试图告诉我以这种方式处理多个对象可能会导致对象处置问题.
我确信在上面的例子中处理一个对象不会抛出异常.那么我应该修改我的代码还是保持原样?
这个问题描述了与CA2202相同的场景,如何解决这种情况,但它不是关于如何修复代码,而是关于为什么首先出现问题.
以下代码:
using (Stream stream = obtainStreamObject())
{
using (var reader = new XmlTextReader(stream))
{
//do something with XmlTextReader
}
}
Run Code Online (Sandbox Code Playgroud)
原因Stream.Dispose()叫两次.首先,内部using块会崩溃,这会调用XmlTextReader.Dispose()哪些调用Stream.Dispose().然后外部using块崩溃并Stream.Dispose()再次被调用.
所以,我必须换Stream到using,但不换行XmlTextReader到using,尽管他们都实现IDisposable.
这会产生CA2202警告
不要多次处理对象对象'stream'可以在方法'MethodName(whatever)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.
好吧,它说第二个Dispose()可能会屈服ObjectDisposedException.这有什么意义?为什么我会这样实现Dispose(),当它第二次被调用它会抛出异常而不是什么都不做?