以下代码会生成两个CA2000警告(其中包括但不是重点)。如何在所有权转移后摆脱CA2000警告?
public sealed class Item: IDisposable
{
public void Dispose() {}
}
public sealed class ItemContainer
{
public void Add(Item item)
{
}
}
public sealed class Test: IDisposable
{
private ICollection<Item> itemCollection;
private ItemContainer itemContainer;
private void Add(Item item)
{
itemCollection.Add(item);
}
public void Initialize()
{
var item1 = new Item(); // no warning
itemCollection.Add(item1);
var item2 = new Item(); // CA2000: call Dispose on object item2
Add(item2);
var item3 = new Item(); // CA2000: call Dispose on object item3
itemContainer.Add(item3);
}
public void Dispose() {}
}
请注意,没有为item1生成警告。看起来,代码分析假定ICollection
将承担该项目的责任,并最终处置它。
有没有一种方法,以纪念我的Add
方法,从而使警报消失?
我在找寻类似于CA1062的ValidatedNotNullAttribute
。
编辑:说清楚:这不是我真正的代码。在真实的代码中,一切都妥善处理。
这只是CA不承认,打到我Add
方法转移所有权。 我希望它能够像处理ICollection.Add
一样对待我的Add方法。
在同一范围内处置不是一种选择。
接受我自己的答案,因为这是我在这种情况下所做的:在已实现IDisposable的类上实现ICollection。我完全同意Damien的观点:如果CA需要IDisposable和ICollection,那将更有意义。 – Henrik 2010-10-23 07:19:38
有什么办法可以通过索引在一次性物品字典上实现类似的东西吗? – Dave 2018-03-02 10:20:34