首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能去掉CA2000警告呢?

为什么我不能去掉CA2000警告呢?
EN

Stack Overflow用户
提问于 2011-11-07 16:36:11
回答 2查看 2.2K关注 0票数 2

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

代码语言:javascript
复制
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警告。

代码语言:javascript
复制
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是一个静态属性。该方法对旧作者进行处理,并设置新的方法。

代码语言:javascript
复制
private static void ResetWriter(ILogWriter newWriter)
{
    if (Writer != null)
        Writer.Dispose();
    Writer = newWriter;
}

编辑

我认为,正如SLaks所说,这是一种假阳性。如果我将ResetWriter的内容放在ResetWriter调用(实际上是反向提取方法重构)的位置上,那么CA2000就会消失。

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

代码语言:javascript
复制
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();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-07 16:57:27

这个警告是假阳性的。

代码分析引擎( Code )没有意识到,ResetWriter需要作者活着,所以它希望您在任何情况下都能处理它。

你应该压制一下警告。

票数 2
EN

Stack Overflow用户

发布于 2011-11-07 16:39:42

当您将null分配给tempWriter

代码语言:javascript
复制
tempWriter = null;

tempWriter不再引用您创建的对象。因此,您没有办法处置该对象。

在这种情况下,您确实应该使用一个using块来代替:

代码语言:javascript
复制
using(var tempWriter = new CsvFileLogWriter(path))
{
    ResetWriter(tempWriter);
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8039550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档