我在我目前的一个项目上运行VS2013的代码分析,并且遇到了" CA1001:拥有一次性领域的类型应该是一次性的。"生成警告的一个简单示例(假设DisposableClass
实现IDisposable
)是:
class HasDisposableClassField
{
private DisposableClass disposableClass;
}
但是,将字段变量转换为属性不再生成警告,即使情况是该属性将由类实例化:
class HasDisposableClassProperty
{
private DisposableClass disposableClass { get; set; }
public HasDisposableClassProperty()
{
disposableClass = new DisposableClass();
}
}
在第一种情况下,很明显该类应该实现IDisposable模式,并适当地处理其disposableClass
字段。我的问题:第二种情况是否缺乏对代码分析工具的限制的警告?尽管没有警告,该班级是否仍然实施IDisposable并处置该财产?
答案 0 :(得分:14)
是的,缺少警告是分析工具的限制。
你绝对应该实现IDisposable
并在自己假设你的IDisposable
属性没有从其他地方注入后进行清理。
答案 1 :(得分:9)
是;你还需要处理它。
将物品放入物业并不会为你神奇地处理它。
缺少警告是代码分析的一个错误(它忽略了支持字段,因为它是由编译器生成的)
答案 2 :(得分:3)
一次性的实施应取决于如何创建需要处置的资源(无论是一次性的还是非管理的)。
如果您的对象通过注入(构造函数,方法或属性)接收资源,它可能不拥有它,因此可能不会将其丢弃。
如何存储资源(本地变量,字段或属性(带有支持字段)并不重要),但是,您可能需要检查您的资源是否已经外部处置,因为您的对象不是&#39它的主人。
如果您的班级直接创建资源(通过创建,分配,打开句柄,工厂方法),它可能拥有它,因此可能应该将其处理掉。
问题是大多数静态代码分析工具都有有限的规则集,因此无法做出这样的区分,而是试图覆盖他们认为更常见的情况。