我正在编写一种重置日志记录系统的方法。我需要获取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();
    }
}

最佳答案

此警告是误报。

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

您应该禁止显示警告。

关于c# - 为什么我不能摆脱CA2000警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8039550/

10-13 03:39