为什么我不能摆脱CA2000警告?

时间:2011-11-07 16:36:12

标签: c# ca2000

我正在编写一个重置日志记录系统的方法。我需要获取CsvFileLogWriter(自定义类)的实例并将其传递给reset方法。 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 处理除非发生此故障 - 在通过 ResetWriter(tempWriter)在属性中设置对象后,对象本身必须保持使用状态。这符合CA2000规则 - 请参阅http://msdn.microsoft.com/en-us/library/ms182289.aspx?queryresult=true

为了澄清,这里是 ResetWriter 的作用 - Writer 是一个静态属性。该方法配置旧的编写器并设置新的编写器。

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

修改

我认为SLaks表示这是误报。如果我获取ResetWriter的内容并将它们放在ResetWriter的调用位置(基本上是反转Extract Method重构),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();
    }
}

3 个答案:

答案 0 :(得分:3)

null分配给tempWriter

tempWriter = null;

tempWriter不再引用您创建的对象。因此,您无法处置对象。

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

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

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

答案 1 :(得分:2)

通过编写tempWriter = null,您可以阻止它被处置,因为finally块仅在此之后运行。

您应该使用using语句。

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

答案 2 :(得分:2)

此警告是误报。

代码分析引擎并没有意识到ResetWriter需要作者保持活力,所以它希望你在所有情况下都能处理它。

你应该取消警告。