Получить список нулевых справочных кодов в Visual Studio

133

В Visual Studio 2013 количество ссылок на специальный код (метод, свойство, поле, ...) отображается с помощью Code Lens . Я хочу получить неиспользуемые (нулевые ссылки) коды в Visual Studio. Есть ли способ их получить?

Я имею в виду ссылку ниже:

введите описание изображения здесь

Нима Ростами
источник
7
Я думаю, ему нужен список всех методов, на которые нет ссылок, вместо того, чтобы свести количество ссылок на этот конкретный метод к нулю.
Юрген Камиллери
1
Если вы действительно хотите найти неиспользуемые ссылки, вы обнаружите много повторяющихся вопросов. Просто
введите в Google запрос
1
да, я хочу найти все неиспользуемые коды, содержащие методы, свойства и т. д.
Нима Ростами
1
Помните, что нельзя быть уверенным в том, что a publicне используется, не изучив всю базу кода. Однако для неиспользуемых внутренних и частных компонентов Code Analysis предупредит вас, если у вас включено соответствующее предупреждение.
Мэтью Уотсон
2
Спустя годы скриншот продолжает вводить в заблуждение.
Sinjai 01

Ответы:

184

Вероятно, лучший и самый простой способ добиться того, что вам нужно, - это использовать встроенный инструмент анализа кода с Visual Studio, чтобы найти и направить вас прямо к мертвому коду и неиспользуемым членам.

Для этого я создал новый файл набора правил анализа кода (через File-> New-> File , убедившись, что на левой панели выбрано General и прокрутите вниз, чтобы найти набор правил анализа кода , присвоив ему имя файла, затем выполнив поиск и выбрав следующие правила). См. Ниже содержимое файла набора правил, который вы можете скопировать и вставить в новый файл с расширением .ruleset для использования.

Имея файл набора правил, можно щелкнуть правой кнопкой мыши файл проекта в панели « Обозреватель решений» и выбрать « Свойства» . В окнах свойств проекта щелкните вкладку Анализ кода на левой панели, а затем щелкните Открыть, чтобы перейти к расположению файла .ruleset. Если вы перейдете к свойствам файла решения (в отличие от файла проекта), вы можете установить файл анализа кода для каждого проекта в решении в одном месте (в разделе Параметры анализа кода и используя раскрывающийся список для выбора ПРИМЕЧАНИЕ: Вы должны были предварительно просмотреть файл набора правил, чтобы он отображался в раскрывающемся списке в этом окне свойств).

Затем вы просто запускаете анализ кода в проектах / решении (через Analyze-> Run Code Analysis On Solution -OR- Alt + F11 ), и он вернется в виде предупреждений, любых методов, на которые нет ссылок, или неиспользуемых элементов, которые он найдет. Он даже найдет методы, на которые ссылается метод, который сам не имеет ссылок в другом месте.

Однако будьте осторожны, поскольку один из способов, которым анализ кода мертвого кода может ввести вас в заблуждение, заключается в том, что ссылка «скрыта», вызывая метод только через делегаты и, конечно же, отражение.

В частности, правила обнаружения мертвого кода:

  • Частные методы, которые не вызываются из другого кода (CA1811)
  • Неиспользуемые локальные переменные (CA1804)
  • Неиспользуемые частные поля (CA1823)
  • Неиспользуемые параметры (CA1801)
  • Внутренние классы, которые не создаются из любого другого кода (CA1812).
  • Мертвый код в ограниченном переключателе побитового ИЛИ (C6259)

Ниже приведено содержимое файла .ruleset, который можно получить, выполнив описанные выше шаги, для вашего удобства. Вы можете просто скопировать приведенный ниже XML, вставить его в блокнот ++, сохранить где-нибудь с расширением .ruleset , найти и использовать, как описано выше:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>
Адам Уайт
источник
30
Я не думаю, что это полностью отвечает на вопрос. Основное отличие заключается в том, что CodeLens сообщит вам, что метод PUBLIC не имеет ссылок во всем решении. Это ключ. FxCop, R # и ваш метод отлично подходит для всего, что не является общедоступным.
Скотт Уайли
1
@ScottWylie - я не согласен. Я просто попробовал вышеуказанное решение, и оно не помечает общедоступные методы, на которые нет ссылки. CodeLens был исключительным при выявлении мертвого кода, локальных файлов без ссылок и неиспользуемых переменных. Я думаю, что это дает большинству людей именно то, что они хотят, без использования сторонних инструментов.
Майк
7
@mike Учтите следующее: если вы хотите найти мертвый код с помощью массовой операции, вы, как правило, не заботитесь о частных / защищенных членах, потому что это локальные проблемы. Например, я мигрирую проект 500k + LoC с более чем 100 проектами и 10+ решениями в архитектуру шаблона репозитория. После миграции компонента мне нужно знать, какие старые интерфейсы я могу удалить. В некоторых IDE, таких как Eclipse, есть инструменты именно для этого. Выделенные серым локальные методы меня просто не интересуют, мне нужен список ПУБЛИЧНЫХ классов / интерфейсов, в которых линза кода сообщит мне «0».
Оливер Шиммер
0

https://scottlilly.com/c-code-quality-improvement/remove-unused-classes-properties-and-functions/

«К сожалению, [в Visual Studio Analysis] вы можете обнаруживать только неиспользуемые частные члены. Это связано с тем, что анализатор кода предполагает, что открытые члены могут использоваться другими программами. Это может быть правдой, если вы публикуете их как API через веб-службу. или выпустить свой код как библиотеку ... ReSharper имеет аналогичные функции анализа кода - с преимуществом проверки на наличие неиспользуемых общедоступных членов ".

В. Френкель
источник
0

Я просматривал каждый файл, выполнял команду Ctrl-MO, чтобы все свернуть, затем прокручивал в поисках ссылки 0.

user1730026
источник
-1

Вот ручной способ сделать это, который я использовал для поиска неиспользуемых классов, помеченных как общедоступные.

  1. Найдите и замените все «общедоступный класс» на «частный класс» для одного проекта в своем решении. Также может потребоваться заменить «публичный статический класс» и / или «публичный абстрактный класс».
  2. Постройте, чтобы найти все ошибки
  3. Для каждой ошибки в сборке используйте систему управления версиями, чтобы восстановить файл для указанного класса.
  4. Повторяйте для каждой ошибки, пока сборка не будет успешной.
  5. Все оставшиеся файлы, которые не были восстановлены, скорее всего, будут удалены.
  6. (необязательно) Переименуйте классы в вышеуказанных файлах и выполните еще одну сборку, чтобы найти ошибки.
  7. Сделайте последний поиск по имени класса, который вы хотите удалить, чтобы убедиться, что ни один из его экземпляров не используется в отражении или магических строках.
  8. Удалите идентифицированные неиспользуемые файлы классов.
  9. Повторите эти действия для каждого проекта решения, который хотите очистить.

Примечание: если вы не следуете правилу «один класс на файл», это потребует гораздо больше работы. Кроме того, для любых конечных точек службы API вам необходимо будет убедиться, что они не используются какими-либо внешними проектами.

Ulfius
источник
14
Это совсем не практично.
Дон Роллинг,
1
Для меня это работает в большом проекте и является одним из решений. Случаи могут отличаться там, где это сложнее, но я хотел предоставить это как возможность.
Ульфиус