微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 处理对象的代码分析友好方式

作为Visual Studio 2010(主要是C#4.0)开发标准的一部分,我们启用了代码分析.当我正在审查最近为新项目提交的代码时,我看到了很多

CA2000 : Microsoft.Reliability: In method ‘XYZ’,object ‘ABC’ is not
disposed along all exception paths. Call System.Idisposable.dispose on
object ‘ABC’ before all references to it are out of scope.

警告.问题是,我所做的一切似乎都没有消除警告 – 我花了几个小时搜索网络并尽我所能.

首先,让我明确一点,我不是在讨论如何使用简单的使用块来正确处理局部变量 – 这不是问题.在我的情况下,当对象由方法返回或分配给方法中的另一个对象时,会出现这些警告.

这是一个代码示例,其中包含四个此类警告:

public void MainMethod()
{
    var object1 = CreateFirstObject();    // Warning here
    var object2 = CreateSecondobject();   // Warning here

    SomeCollectionProperty.Add(object1);
    SomeCollectionProperty.Add(object2);
}

private SomeObject CreateFirstObject()
{
    var theObject = new SomeObject()      // Warning here
    {
        FirstProperty = "some value",// ...
    };

    return theObject;
}

private SomeOtherObject CreateSecondobject()
{
    var theObject = new SomeOtherObject() // Warning here
    {
        FirstProperty = "a different value",// ...
    };

    return theObject;
}

我已经评论了警告发生的地方.

我已经尝试重构两个Create方法,如MSDN文章(here)中所述,但警告仍然出现.

UPDATE
我应该注意SomeObject和SomeOtherObject都实现了Idisposable.

此外,尽管对象初始值设定项可能是问题的一个组成部分,但请记住,初始化程序与两个私有方法隔离,与MainMethod中的警告无关.

谁能告诉我如何正确实施这些方法来消除CA2000警告?

解决方法

在这种情况下,CA2000正在检测的问题是,如果在将异常传递出方法之前发生异常,则一次性实例可能是“孤立的”.例如,CreateFirstObject的“正确”实现看起来如下所示:
private SomeObject CreateFirstObject()
{
    var theObject = new SomeObject();
    try
    {
        theObject.FirstProperty = "some value";
    }
    catch
    {
        theObject.dispose();
        throw;
    }

    return theObject;
}

鉴于您所描述的有关MainMethod所需行为的内容,其“正确”实现可能如下所示:

public void MainMethod()
{
    var object1 = CreateFirstObject();
    try
    {
        SomeCollectionProperty.Add(object1);

        var object2 = CreateSecondobject();
        try
        {
            SomeCollectionProperty.Add(object2);
        }
        catch
        {
            object2.dispose();
            throw;
        }
    }
    catch
    {
        object1.dispose();
        SomeCollectionProperty.Remove(object1); // Not supposed to throw if item does not exist in collection.

        throw;
    }
}

原文地址:https://www.jb51.cc/csharp/100895.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐