Идентифицировать объекты IDisposable
Мне нужно просмотреть код, сделанный кем-то другим, у которого есть некоторые утечки памяти. Прямо сейчас я ищу одноразовые объекты, чтобы заключить их в оператор using, и я хотел бы знать, есть ли быстрый способ, который сообщает вам все одноразовые объекты, объявленные в. Я имею в виду что-то вроде resharper или другого плагина visual studio.
спасибо.
Ответы
Ответ 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, но используется ли используемый класс службы? Как с этим справиться? и др.