Нужно ли утилизировать временные одноразовые предметы?

У меня есть класс, который создает несколько объектов IDisposable, все эти объекты затем передаются другому классу «менеджера» в сторонней библиотеке. Поскольку мне нужны некоторые объекты в последующих вызовах, я сохранил ссылку на локальное поле для созданных объектов, чтобы я мог получить к ним доступ позже. Когда я запустил FxCop в классе, он сказал, что я должен реализовать IDisposable из-за одноразовых объектов, на которые я сохранил ссылку. Мои вопросы:

  1. Должен ли я реализовать IDisposable для своего класса? (или это ответственность менеджера?)
  2. Если да, следует ли мне удалять только те объекты, на которые я ссылался? или мне следует найти способ избавиться от всех созданных мною объектов.

Мой код:

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

Чувак, я написал целую статью и демонстрационный проект, чтобы задать один и тот же вопрос. Слава богу, это уже было доступно. У меня была аналогичная проблема.

dance2die 20.03.2009 18:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
569
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы создаете какие-либо одноразовые объекты, вы должны либо утилизировать их самостоятельно, либо передать их другому классу, который возьмет на себя ответственность за это.

В этом случае я бы сказал, что это действительно зависит от того, что будет делать класс менеджера. Если это гарантирует, что он избавится от всего, что к нему добавлено, все в порядке. Это действительно выглядит несколько странно - я не могу сказать, что сам использовал что-то подобное. Это не значит, что это обязательно неправильно / плохо, но, по крайней мере, стоит еще раз взглянуть, чтобы увидеть, есть ли способ избежать этой небольшой путаницы с правом собственности.

Имейте в виду, что если менеджер удаляет объект, на который вы ссылаетесь, впоследствии он, скорее всего, станет непригодным для использования.

Ответ принят как подходящий

Класс, которому принадлежит объект, должен избавляться от них ... Похоже, ваш менеджер является владельцем, поэтому он должен избавиться от объекта.

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

Другие вопросы по теме