2

我正在编写一种重置日志系统的方法。我需要获取 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引用的 writer - 这不是临时对象,只是临时引用。我只在 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 的调用(本质上是反转提取方法重构),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();
    }
}
4

3 回答 3

3

当您分配nulltempWriter

tempWriter = null;

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

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

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

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

于 2011-11-07T16:39:42.930 回答
2

通过编写tempWriter = null,您可以防止它被丢弃,因为该finally块仅在此之后运行。

您应该改用该using语句。

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

于 2011-11-07T16:38:17.497 回答
2

此警告是误报。

代码分析引擎没有意识到ResetWriter需要编写者保持活力,因此它希望您在所有情况下都将其处理掉。

您应该抑制警告。

于 2011-11-07T16:57:27.060 回答