实现IDisposable - 一次性字段与一次性属性

时间:2014-11-17 16:46:26

标签: c#

我在我目前的一个项目上运行VS2013的代码分析,并且遇到了" CA1001:拥有一次性领域的类型应该是一次性的。"生成警告的一个简单示例(假设DisposableClass实现IDisposable)是:

class HasDisposableClassField
{
    private DisposableClass disposableClass;
}

但是,将字段变量转换为属性不再生成警告,即使情况是该属性将由类实例化:

class HasDisposableClassProperty
{
    private DisposableClass disposableClass { get; set; }
    public HasDisposableClassProperty()
    {
        disposableClass = new DisposableClass();
    }
}

在第一种情况下,很明显该类应该实现IDisposable模式,并适当地处理其disposableClass字段。我的问题:第二种情况是否缺乏对代码分析工具的限制的警告?尽管没有警告,该班级是否仍然实施IDisposable并处置该财产?

3 个答案:

答案 0 :(得分:14)

是的,缺少警告是分析工具的限制。

你绝对应该实现IDisposable并在自己假设你的IDisposable属性没有从其他地方注入后进行清理。

答案 1 :(得分:9)

是;你还需要处理它。

将物品放入物业并不会为你神奇地处理它。

缺少警告是代码分析的一个错误(它忽略了支持字段,因为它是由编译器生成的)

答案 2 :(得分:3)

一次性的实施应取决于如何创建需要处置的资源(无论是一次性的还是非管理的)。

如果您的对象通过注入(构造函数,方法或属性)接收资源,它可能不拥有它,因此可能不会将其丢弃。

如何存储资源(本地变量,字段或属性(带有支持字段)并不重要),但是,您可能需要检查您的资源是否已经外部处置,因为您的对象不是&#39它的主人。

如果您的班级直接创建资源(通过创建,分配,打开句柄,工厂方法),它可能拥有它,因此可能应该将其处理掉。

问题是大多数静态代码分析工具都有有限的规则集,因此无法做出这样的区分,而是试图覆盖他们认为更常见的情况。