嵌套"使用"c#中的语句
本文关键字:quot 语句 使用 嵌套 | 更新日期: 2023-09-27 17:49:24
我最近下载了Visual Studio 2013,并在我正在做的一个项目上运行了代码分析。这引发了我正在解决的几个问题,但其中一个特别的问题是我如何使用"using"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();
}
}
}
我理解Analysis警告试图告诉我,以这种方式处理多个对象可能会引发对象处理问题。
我确信在上面的例子中,对一个对象进行处理不会抛出异常。那么,我应该修改代码还是保持原样?
据我所知,你的代码应该没有问题,我过去一直使用嵌套的using语句。
从其他问题来看,我认为问题在于代码分析工具本身以及CA2000和CA2202规则。当使用using语句使用各种流和读取器类型时,经常会出现误报。
您应该忽略警告并继续,因为替代方法(例如try/finally)将产生错误代码,而您的代码是有效的。
From MSDN
在你的例子中嵌套的using语句(在Visual Basic中使用)可能导致违规CA2202警告。如果可处置资源的嵌套内部Using语句包含外部Using语句的资源,嵌套资源的Dispose方法释放所包含的资源。发生这种情况时,外部的Dispose方法Using语句试图第二次释放其资源。
。这样使用它是可以的。所以,你应该直接忽略这个警告。
或
你可以通过实现Try/finally来修改你的代码,用一种难看的方式来抑制警告。尽管,您确实应该避免
我不认为使用多个using
语句来处理对象有任何问题。嵌套using语句是很常见的,你的代码是有效的。
使用不同类型的对象,如果想节省空间和提高可读性,可以使用一行语法嵌套:
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();
}
您在使用代码分析时遇到的问题是反复出现的(您可以在这里找到警告的原因)。然后,您可以忽略关于多个using语句的警告,因为这是一个误报,您的代码很好且有效。
您还可以通过这种方式抑制警告(感谢@ jord
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public void MyMethodWithUsings()
{
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();
}
}
如果你想删除警告,你必须使用try/finally
块重写你的代码,并在finally
块中调用对象的Dispose()
方法,但这将产生可怕的,不容易阅读的代码,正如你在这个问题中看到的。
这是代码分析和CA2000和CA2202中反复出现的问题。
您可以通过不使用using
而使用try/finally/dipose
来修复这些警告。不建议这样做,因为它会生成糟糕的代码。
您的代码将工作,只需抑制那些警告。
参见https://stackoverflow.com/a/21849534/870604了解StreamReader/Writer
和底层流所有权。
对于这种类型的警告,您可以很容易地忽略该警告,因为它通常是误报。查看以下链接获取更多信息:
- CA2202,如何解决这种情况
- http://msdn.microsoft.com/en-us/library/ms182334.aspx 代码分析规则CA2000/CA2202