Мне нужно реорганизовать большое приложение С#, и я нашел много функций, которые никогда не используются. Как я могу проверить неиспользуемый код, поэтому я могу удалить все неиспользуемые функции?
Найти неиспользуемый код
Ответ 1
Да, ReSharper делает это. Щелкните правой кнопкой мыши на своем решении и выберите "Найти проблемы с кодом". Одним из результатов является "Unused Symbols". Это покажет вам классы, методы и т.д., Которые не используются.
Ответ 2
Это большой вопрос, но будьте осторожны, что вы наступаете в опасных водах здесь. Когда вы удаляете код, вам нужно будет убедиться, что вы часто компилируете и тестируете.
Один замечательный инструмент приходит на ум:
NDepend - этот инструмент просто потрясающий. Это займет немного времени, чтобы заглянуть, и после первых 10 минут я думаю, что большинство разработчиков просто говорят "Вверните это!". и удалите приложение. Как только вы получите хорошее отношение к NDepend, это дает вам потрясающее представление о том, как ваши приложения связаны. Проверьте это: http://www.ndepend.com/. Самое главное, что этот инструмент позволит вам просматривать методы, которые не имеют прямых абонентов. Он также покажет вам обратное, полное дерево вызовов для любого метода в сборке (или даже между сборками).
Независимо от того, какой инструмент вы выберете, это не задача легкомысленно. Особенно, если вы имеете дело с общедоступными методами в сборках типов библиотек, поскольку вы никогда не узнаете, когда приложение ссылается на них.
Ответ 3
Resharper хорош для этого, как утверждают другие. Однако будьте осторожны, эти инструменты не находят вам код, который используется при отражении, например. не может знать, не используется ли какой-либо код при отражении.
Ответ 4
Как указано Jeff, инструмент NDepend может помочь найти неиспользуемые методы, поля и типы.
Чтобы разработать немного, NDepend предлагает написать Code Rule over LINQ Query (CQLinq). Около 200 правил кода по умолчанию, 3 из которых посвящены обнаружению неиспользуемого/мертвого кода
В принципе такое правило для обнаружения неиспользуемого метода, например, выглядит следующим образом:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
Но это правило наивно и вернет тривиальные ложные срабатывания. Существует много ситуаций, когда метод никогда не вызывается, но он не используется (точка входа, конструктор класса, финализатор...), поэтому правила 3 по умолчанию более разработаны:
- Потенциально мертвые типы (следовательно, обнаружить неиспользуемый класс, структуру, интерфейс, делегат...)
- Потенциально мертвые методы
- Потенциально мертвые поля
NDepend интегрируется в Visual Studio 2017,2015, 2013, 2012, 2010, таким образом, эти правила могут быть проверены/просмотрены/отредактированы прямо внутри IDE. Инструмент также может быть интегрирован в ваш процесс CI, и он может построить reports, в котором будут отображаться нарушения правил и элементы кода. NDepend также имеет расширение VS Team Services.
Если вы нажмете эти 3 ссылки выше на исходный код этих правил, вы увидите, что те, которые относятся к типам и методам, немного сложны. Это связано с тем, что они обнаруживают не только неиспользуемые типы и методы, но также типы и методы, используемые только неиспользуемыми мертвыми типами и методами (рекурсивными).
Это статический анализ, поэтому префикс Потенциально в именах правил. Если элемент кода используется только через отражение, эти правила могут считать его неиспользованным, что не так.
В дополнение к использованию этих 3 правил я бы посоветовал измерить охват кода тестами и стремиться к полному охвату. Часто вы увидите, что код, который не может быть охвачен испытаниями, на самом деле неиспользуемый/мертвый код, который можно безопасно отбросить. Это особенно полезно в сложных алгоритмах, где неясно, доступна ли ветвь кода или нет.
Отказ от ответственности: я работаю для NDepend.
Ответ 5
Я бы также упомянул, что использование IOC aka Unity может сделать эти оценки ошибочными. Возможно, я ошибался, но несколько очень важных классов, которые создаются через Unity, по-видимому, не имеют никакого экземпляра, насколько может сказать ReSharper. Если бы я выполнил рекомендации ReSharper, я бы получил hosed!
Ответ 6
ReSharper отлично справляется с поиском неиспользуемого кода.
В VS IDE вы можете щелкнуть правой кнопкой мыши по определению и выбрать "Найти все Ссылки ", хотя это работает только на уровне решения.
Ответ 7
Я столкнулся с AXTools CODESMART. Используйте анализатор кода в разделе отзывов. Он отобразит мертвые локальные и глобальные функции вместе с другие вопросы.
Ответ 8
FXCop - это анализатор кода... Он делает гораздо больше, чем поиск неиспользуемого кода. Я использовал FXCop некоторое время и был так потерян в своих рекомендациях, что я удалил его.
Я думаю, что NDepend выглядит скорее вероятным кандидатом.
Ответ 9
Истина заключается в том, что инструмент никогда не сможет дать вам 100% -ный ответ, но инструмент покрытия может дать вам неплохую работу за деньги.
Если вы считаете, что с полным пакетом unit test, чем вы можете использовать инструмент тестирования, чтобы увидеть, какие строки кода не выполнялись во время тестового прогона. Вам все равно необходимо проанализировать код вручную: либо устраните то, что вы считаете мертвым кодом, либо напишите тест, чтобы улучшить охват тестирования.
Одним из таких инструментов является NCover, с открытым исходным кодом на Sourceforge. Другой альтернативой является PartCover.
Проверьте ответ на stackoverflow.