El siguiente código genera dos advertencias de CA2000 (entre otros, pero ese no es el punto).¿Cómo deshacerse de la advertencia CA2000 cuando se transfiere la propiedad?
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() {}
}
Tenga en cuenta que no se genera ninguna advertencia para el elemento1. Parece que Code Analysis asume que el ICollection
se hará cargo del artículo y eventualmente lo eliminará.
¿Hay alguna manera de marcar mis métodos Add
, para que la advertencia desaparezca?
Estoy buscando algo similar a ValidatedNotNullAttribute
para CA1062.
Editar: para que quede claro: este no es mi código real. En el código real, todo está correctamente dispuesto.
Es solo que CA no reconoce que la llamada a mis métodos Add
transfiere la propiedad. Me gustaría que tratara mis métodos Agregar de la misma manera que trata ICollection.Add
.
Desechar en el mismo ámbito no es una opción.
He aceptado mi propia respuesta, porque esto es lo que hice en este caso: implementar ICollection en una clase que ya implementó IDisposable. Estoy totalmente de acuerdo con Damien: tendría más sentido, si CA requiere tanto IDisposable como ICollection. – Henrik
¿Hay alguna manera de implementar algo similar en un diccionario de artículos desechables por índice? – Dave