Подтвердить что ты не робот

Удаление неиспользуемого кода в Visual Studio

В связи с этим вопросом: Удалить неиспользуемые ссылки (!= "using" )", я хотел бы знать, есть ли инструмент для удаления неиспользуемых классы, структуры, делегаты и т.д. из решения Visual Studio.

Сценарий:

У меня есть неорганизованное решение Visual Studio, которое состоит из 1000:

  • Импорт собственных методов
  • Структуры
  • Делегаты
  • Перечисления

Вместо того, чтобы тратить каждый файл, нажав "Найти все ссылки" и определить, используется ли какой-либо код где-нибудь, есть ли какой-либо механизм, где я могу просто удалить избыточные файлы кода?

Пример:

//This class contains a method called getRandomValue which returns type RANDOM
public class NativeMethods
{
    [DllImport("random.dll")]
    public static extern RANDOM getRandomValue();
}

//This is the RANDOM object as referenced by getRandomValue();
[StructLayout(LayoutKind.Sequential)]
public struct RANDOM
{
    uint a;
    uint b;
    uint c;
}

//This is redundant since nothing is referencing it.
[StructLayout(LayoutKind.Sequential)]
public struct MESSAGE
{
    IntPtr sender;
    IntPtr recipient;
    char[] mText;
}

Примечание для себя:

Я чувствую, что это будет сложно, поскольку в отличие от Java, имена объектов не обязательно должны совпадать с именем файла, а несколько объявлений объектов могут находиться в одном файле, однако в этом случае (мой сценарий) каждый объект объявляется в собственном файле (с идентичным именем).

4b9b3361

Ответ 1

ReSharper - лучший выбор для очистки вашего кода.

Вы можете использовать его бесплатно благодаря ReSharper Early Access Program.

enter image description here

Ответ 2

Есть несколько инструментов, которые вы можете использовать для этого:

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

Ответ 3

Как указано @Ergwun, инструмент 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

NDepend правило для поиска неиспользуемых методов (мертвых методов)

Но это правило наивно и вернет тривиальные ложные срабатывания. Существует много ситуаций, когда метод никогда не вызывается, но он не используется (точка входа, конструктор класса, финализатор...), поэтому правила 3 ​​по умолчанию более разработаны:

NDepend интегрируется в Visual Studio 2017,2015, 2013, 2012, 2010, таким образом, эти правила могут быть проверены/просмотрены/отредактированы прямо внутри IDE. Инструмент также может быть интегрирован в ваш процесс CI, и он может построить reports, в котором будут отображаться нарушения правил и элементы кода. NDepend также имеет расширение VS Team Services.

Если вы нажмете эти 3 ссылки выше на исходный код этих правил, вы увидите, что те, которые относятся к типам и методам, немного сложны. Это связано с тем, что они обнаруживают не только неиспользуемые типы и методы, но также типы и методы, используемые только неиспользуемыми мертвыми типами и методами (рекурсивными).

Это статический анализ, поэтому префикс Потенциально в именах правил. Если элемент кода используется только через отражение, эти правила могут считать его неиспользованным, что не так.

В дополнение к использованию этих 3 правил я бы посоветовал измерить охват кода тестами и стремиться к полному охвату. Часто вы увидите, что код, который не может быть охвачен испытаниями, на самом деле неиспользуемый/мертвый код, который можно безопасно отбросить. Это особенно полезно в сложных алгоритмах, где неясно, доступна ли ветвь кода или нет.

Отказ от ответственности: я работаю для NDepend.