У меня есть класс, который создает несколько объектов IDisposable, все эти объекты затем передаются другому классу «менеджера» в сторонней библиотеке. Поскольку мне нужны некоторые объекты в последующих вызовах, я сохранил ссылку на локальное поле для созданных объектов, чтобы я мог получить к ним доступ позже. Когда я запустил FxCop в классе, он сказал, что я должен реализовать IDisposable из-за одноразовых объектов, на которые я сохранил ссылку. Мои вопросы:
public class MyClass
{
ClassThatIsDisposable aReference;
}
public MyClass(ManagerClass manager)
{
ClassThatIsDisposable transient=new ClassThatIsDisposable();
manager.Add(transient);
aReference=new ClassThatIsDisposable();
manager.Add(aReference);
}
public void LaterCall()
{
areference.Method();
}





Если вы создаете какие-либо одноразовые объекты, вы должны либо утилизировать их самостоятельно, либо передать их другому классу, который возьмет на себя ответственность за это.
В этом случае я бы сказал, что это действительно зависит от того, что будет делать класс менеджера. Если это гарантирует, что он избавится от всего, что к нему добавлено, все в порядке. Это действительно выглядит несколько странно - я не могу сказать, что сам использовал что-то подобное. Это не значит, что это обязательно неправильно / плохо, но, по крайней мере, стоит еще раз взглянуть, чтобы увидеть, есть ли способ избежать этой небольшой путаницы с правом собственности.
Имейте в виду, что если менеджер удаляет объект, на который вы ссылаетесь, впоследствии он, скорее всего, станет непригодным для использования.
Класс, которому принадлежит объект, должен избавляться от них ... Похоже, ваш менеджер является владельцем, поэтому он должен избавиться от объекта.
Если вы пытаетесь избежать предупреждения FXCop, то один из вариантов - заставить MyClass запрашивать одноразовый объект у менеджера каждый раз, когда это необходимо. Таким образом, у вас не будет переменной-члена, содержащей ссылку на нее. Вы могли бы сделать это, если бы метод Add () возвращал ключ для добавленного объекта, а затем использовал этот ключ для извлечения объекта из диспетчера, когда вам нужно его использовать.
Чувак, я написал целую статью и демонстрационный проект, чтобы задать один и тот же вопрос. Слава богу, это уже было доступно. У меня была аналогичная проблема.