Подтвердить что ты не робот

Идентифицировать объекты IDisposable

Мне нужно просмотреть код, сделанный кем-то другим, у которого есть некоторые утечки памяти. Прямо сейчас я ищу одноразовые объекты, чтобы заключить их в оператор using, и я хотел бы знать, есть ли быстрый способ, который сообщает вам все одноразовые объекты, объявленные в. Я имею в виду что-то вроде resharper или другого плагина visual studio.

спасибо.

4b9b3361

Ответ 1

Я знаю, что вы имеете в виду. Я не знаю, но посмотри на FxCop. Возможно, в нем есть правило, которое проверяет, не удалены ли объекты, реализующие IDisposable. Просто догадка, разум.

UPDATE: Митч Пшеница пишет:

FxCop включает правило, которое говорит, что все типы, которые производятся от типов, реализующих IDisposable, должны реализовывать шаблон Dispose()

Спасибо, Митч.

Ответ 2

Вы можете сделать это с помощью ReSharper. С помощью ReSharper вы можете легко перемещаться по реализациям любого интерфейса с помощью Alt-End, но для популярного интерфейса, такого как IDisposable, это нецелесообразно.

Вот что вы могли бы сделать:

  • Перейдите в Обозреватель объектов (Ctrl-Alt-J или View- > Object Browser)
  • Найти System.IDisposable
  • Щелкните правой кнопкой мыши и выберите "Найти дополнительные приложения" (пункт меню ReSharper).
  • Поиск пользователя, проверка "Реализации" в разделе "Область применения" выберите "Решение"
  • Вы получите список всех типов (вашего решения), реализующих IDisposable. Те, кто находится в жирный, являются теми, которые вы хотите - они реализуют IDisposable напрямую.

Надеюсь, что это поможет.

Ответ 3

Правила использования CA2213 (DisposableFieldsShouldBeDisposed) и CA2215 (DisposeMethodsShouldCallBaseClassDispose) внутри FxCop поймают, где dispose не вызывается правильно в ваших собственных классах, но я не верю, что есть что-то там, чтобы проверять dispose, всегда называется, хотя по иронии судьбы правило (CA2202) для DoNotDisposeObjectsMultipleTimes

Ответ 4

Кроме того, в зависимости от того, используете ли вы такие системы, если вы используете контейнер IoC, он может проходить через несколько уровней кода до того, как служба будет возвращена вам через интерфейс, и это может быть не так просто для обработки IDisposable в таком случае.

Возможно, интерфейс, который вы разрешили, не наследуется от IDisposable, но используется ли используемый класс службы? Как с этим справиться? и др.