Есть ли инструмент для поиска функций без ссылок (мертвый, устаревший код) в приложении C#?
Я хочу удалить foo(), если foo() нигде не вызывается.
7 ответов
Жандарм обнаружит частные методы без вызывающих абонентов. Это доступно кроссплатформенное, и последняя версия обрабатывает " AvoidUncalledPrivateCodeRule".
FxCop обнаружит общедоступные / защищенные методы без вызывающих абонентов. Однако FxCop не обнаруживает все методы без вызывающих абонентов, так как он предназначен для проверки того, что ваш код является частью библиотеки, поэтому открытые члены не учитываются. Вы можете использовать NDepend для поиска общедоступных членов без вызывающих абонентов, о которых я подробно расскажу в этом другом ответе Stackru.
(редактировать: добавлена информация о Жандарме, который фактически делает то, что спросил спрашивающий)
Помните, что Resharper (и, возможно, другие подобные инструменты) не будут выделять неиспользуемые методы, если методы помечены public
, Инструмент статического анализа кода не сможет проверить, используются ли методы вашей сборки другими сборками за пределами вашего решения. Таким образом, первый шаг в отсеивании неиспользованных методов состоит в том, чтобы уменьшить их видимость до private
или же internal
,
Да, в надстройке MZ-Tools есть функция проверки мертвого кода.
Инструмент NDepend может помочь найти неиспользуемый код в базе кода.NET. Отказ от ответственности: я один из разработчиков этого инструмента.
NDepend предлагает написать правило кода поверх LINQ Query (CQLinq). Предложено около 200 правил кода по умолчанию, 3 из которых посвящены обнаружению неиспользуемого / мертвого кода:
- Потенциально мертвые типы (следовательно, обнаружение неиспользуемого класса, структуры, интерфейса, делегата...)
- Потенциально мертвые методы
- Потенциально мертвые поля
NDepend интегрирован в Visual Studio, поэтому эти правила можно проверять / просматривать / редактировать прямо в IDE. Инструмент также может быть интегрирован в процесс CI и может создавать отчеты, которые будут отображать нарушенные правила и элементы кода виновника.
Если вы нажмете эти 3 ссылки на исходный код этих правил, вы увидите, что те, которые касаются типов и методов, немного сложны. Это потому, что они обнаруживают не только неиспользуемые типы и методы, но также типы и методы, используемые только неиспользуемыми мертвыми типами и методами (рекурсивные).
Это статический анализ, отсюда и префикс Потенциально в именах правил. Если элемент кода используется только для отражения, эти правила могут рассматривать его как неиспользуемый, что не так.
В дополнение к использованию этих 3 правил, я бы посоветовал измерять покрытие кода тестами и стремиться к полному охвату. Часто вы увидите, что код, который не может быть покрыт тестами, на самом деле является неиспользованным / мертвым кодом, который можно безопасно отбросить. Это особенно полезно в сложных алгоритмах, где неясно, достижима ли ветвь кода или нет.
Решарпер делает это, и не только с помощью методов. Это также делается с помощью операторов, переменных и так далее.
Хорошо, если VS не делает это изначально, простой метод состоит в том, чтобы щелкнуть правой кнопкой мыши по методу и выбрать "найти все ссылки" . Если есть только 1 ссылка (где она объявлена), она, скорее всего, больше нигде не используется.