C# 无法摆脱CA2202警告
我已经阅读了MSDN页面上的以下内容: 这也是答案: 但以下代码仍然为我生成2个CA2202警告:C# 无法摆脱CA2202警告,c#,code-analysis,ca2202,C#,Code Analysis,Ca2202,我已经阅读了MSDN页面上的以下内容: 这也是答案: 但以下代码仍然为我生成2个CA2202警告: FileStream fileStream = null; BufferedStream bufferedStream = null; try { fileStream = File.Open(...); bufferedStream = new BufferedStream(fileStream); using (StreamReader streamReader =
FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
fileStream = File.Open(...);
bufferedStream = new BufferedStream(fileStream);
using (StreamReader streamReader = new StreamReader(bufferedStream))
{
...
}
}
finally
{
if (bufferedStream != null)
{
bufferedStream.Dispose();
}
if (fileStream != null)
{
fileStream.Dispose();
}
}
“bufferedStream.Dispose()”行仍然给出以下两个警告:
严重性代码说明项目文件行抑制状态
警告CA2202对象“bufferedStream”可以在方法“Loader.UpdateIndex()”中多次释放。为避免生成System.ObjectDisposedException,您不应对对象多次调用Dispose。示例:行:930 Loader C:\Users\user\Loader\Loader.cs 930 Active
及
严重性代码说明项目文件行抑制状态
警告CA2202对象“fileStream”可以在方法“Loader.UpdateIndex()”中多次释放。为避免生成System.ObjectDisposedException,您不应在对象上多次调用Dispose。示例:行:930,935 Loader C:\Users\user\Loader\Loader.cs 930 Active
这大概是因为fileStream可以被多次处理?但是bufferedStream如何被多次处理呢
编辑:我已将不信者的回答@Damien_标记为正确。实际上,您也可以对其进行精简,因为正如下面提到的,您不需要bufferedReader变量。这就是我的结局。这有点难看,但它能起作用:
FileStream fileStream = null;
try
{
fileStream = File.Open("iaushdiuh", FileMode.Open);
fileStream = null;
using (StreamReader streamReader = new StreamReader(fileStream))
{
streamReader.ReadLine();
}
}
finally
{
if (fileStream != null)
{
fileStream.Dispose();
}
}
如果在将这些对象的所有权“传递”给其他对象后不使用底层流,则可以按如下方式消除警告:
FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
fileStream = File.Open(...);
bufferedStream = new BufferedStream(fileStream);
fileStream = null;
using (StreamReader streamReader = new StreamReader(bufferedStream))
{
bufferedStream = null;
...
}
}
finally
{
if (bufferedStream != null)
{
bufferedStream.Dispose();
}
if (fileStream != null)
{
fileStream.Dispose();
}
}
您希望
null
的赋值在构造函数调用“取得一次性对象的所有权”之后立即发生。通过这种方式,您可以确保,如果构造函数抛出内部对象,您将处理内部对象,如果构造函数成功,那么它将安排进行处理。在将它们传递给其他构造函数后,您是否使用fileStream
或bufferedStream
。我在回答中放置的代码在VS 2017下编译(启用构建分析)时没有警告(前提是..
块被可用代码替换)。如果您有一个可复制的代码示例,可能会引起警告,请将您的问题包括在内。@Damien_The_unsiever嘿,对不起,当时我没有时间再研究这个问题,但我刚刚回到它,是的,您的解决方案不会生成任何警告,谢谢。我已将答案标记为正确,并将编辑我的原始帖子。这样做,最终可以删除,并在使用()的结尾添加以下内容:代码>bufferedStream=null代码>@DonaldJansen-不,你这样做仍然会得到警告。关键是在另一个构造函数完成后,在不引发异常的情况下,null
立即输出相应的变量,以便新构造的对象现在负责处理。感谢您的回复,但我仍然使用此方法得到2202警告。@JD41-我没有得到与所列代码完全相同的警告,假设我用有效参数替换第一个..
,并用其他代码替换第二个..
。