为什么我无法摆脱 CA2000 警告?

  • 本文关键字:CA2000 警告 c# ca2000
  • 更新时间 :
  • 英文 :


我正在编写一个重置日志系统的方法。我需要得到一个CsvFileLogWriter(自定义类)的实例,并将其传递给重置方法。CsvFileLogWriter是一次性的,所以我得到一个CA2000警告告诉我:

Warning 2   CA2000 : Microsoft.Reliability : In method 'Logger.InitializeCsvLogger
(string)', call System.IDisposable.Dispose on object 'tempWriter'
 before all references to it are out of scope.

我遵循了有关CA2000的说明,我最终采用了以下方法。但是,我仍然得到CA2000警告。

public static void InitializeCsvLogger(string path)
{
    ILogWriter tempWriter = null;
    try
    {
        tempWriter = new CsvFileLogWriter(path);
        ResetWriter(tempWriter);
        tempWriter = null;
    }
    finally
    {
        if (tempWriter != null)
            tempWriter.Dispose();
    }
}
有人能指出我的错误吗?

编辑

我不希望释放由tempWriter引用的写入器——这不是一个临时对象,只是一个临时引用。我只在try块中出现失败时才处理它(因此tempWriter永远不会被设置为null,并且finally块中的if语句会清除资源。)我不希望tempWriter被处理,除非这个错误发生——对象本身在被 resetwwriter (tempWriter)设置为属性后必须保持在使用状态。这是根据CA2000规则-参见http://msdn.microsoft.com/en-us/library/ms182289.aspx?queryresult=true

澄清一下,下面是 resetwwriter 的作用——Writer是一个静态属性。该方法处理旧的写入器并设置新写入器。

private static void ResetWriter(ILogWriter newWriter)
{
    if (Writer != null)
        Writer.Dispose();
    Writer = newWriter;
}

编辑

我认为,正如SLaks所说,这是一个假阳性。如果我把resetwwriter的内容放在对resetwwriter的调用的位置(本质上是逆转提取方法重构),CA2000就会消失。

或者换句话说,下面没有给出CA2000警告:

public static void InitializeCsvLogger(string path)
{
    ILogWriter tempWriter = null;
    try
    {
        tempWriter = new CsvFileLogWriter(path);
        if (Writer != null)
            Writer.Dispose();
        Writer = tempWriter;
        tempWriter = null;
    }
    finally
    {
        if (tempWriter != null)
            tempWriter.Dispose();
    }
}

当您将null分配给tempWriter时:

tempWriter = null;

tempWriter不再指向您创建的对象。因此,您无法Dispose对象。

在这种情况下,你应该使用using块:

using(var tempWriter = new CsvFileLogWriter(path))
{
    ResetWriter(tempWriter);
}

通过这样做,您不再需要担心调用Dispose(或将引用设置为null)。

此警告为误报。

代码分析引擎没有意识到ResetWriter需要写入器保持活动,所以它希望您在所有情况下都处理它。

通过写tempWriter = null,你可以防止它被处理,因为finally块只在它之后运行。

您应该使用using语句。

这个答案是正确的,但是与你的实际意图相矛盾

相关内容

  • 没有找到相关文章

最新更新