Определить идентифицируемые объекты - PullRequest
12 голосов
/ 26 февраля 2009

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

спасибо.

Ответы [ 4 ]

11 голосов
/ 26 февраля 2009

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

ОБНОВЛЕНИЕ : Митч Уит пишет:

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

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

10 голосов
/ 26 февраля 2009

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

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

  1. Перейти к Обозревателю объектов (Ctrl-Alt-J или Вид-> Обозреватель объектов)
  2. Найти System.IDisposable
  3. Щелкните правой кнопкой мыши и выберите «Расширенный поиск использования» (пункт меню ReSharper)
  4. User Find, отметьте «Реализации», в разделе «Scope» выберите Solution
  5. Вы получите список всех типов (вашего решения), реализующих IDisposable. Те, которые выделены жирным шрифтом - это те, которые вам нужны - они реализуют IDisposable напрямую.

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

5 голосов
/ 26 февраля 2009

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

0 голосов
/ 26 февраля 2009

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

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

...