How to get rid of CA2000 warning when ownership is transferred?

Henrik picture Henrik · Oct 14, 2010 · Viewed 12.1k times · Source

The following code generates two CA2000 warnings (among others, but that's not the point).

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() {}
}

Note that there is no warning generated for item1. It seems, Code Analysis assumes the ICollection will take responsibility of the item and eventually dispose it.

Is there a way to mark my Add methods, so that the warning goes away?

I'm looking for something similar to ValidatedNotNullAttribute for CA1062.

Edit: to make it clear: this is not my real code. In the real code, everything is properly disposed.

It's just that CA does not recognize that the call to my Add methods transfers ownership. I would like it to treat my Add methods in the same way it treats ICollection.Add.

Disposing in the same scope is not an option.

Answer

LukeH picture LukeH · Oct 14, 2010

Do you want to fix the code or just suppress the warnings? Suppressing the warnings is straightforward:

[SuppressMessage("Microsoft.Reliability",
                 "CA2000:DisposeObjectsBeforeLosingScope",
                 Justification = "Your reasons go here")]
public void Initialize()
{
    // ...
}