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

Оптимизация компилятора С# - неиспользуемые методы

Компилятор С# (в VS2008 или VS2010) удаляет неиспользуемые методы при компиляции?

Я предполагаю, что может возникнуть проблема с решением, будут ли использоваться общедоступные методы, поэтому я предполагаю, что он скомпилирует все общедоступные методы.

Но как насчет частных методов, которые никогда не используются внутри класса?

EDIT:

Есть ли набор правил об опцификации компилятора, которые документированы где угодно?

4b9b3361

Ответ 1

Просто зарегистрирован в рефлекторе с выпуском. Компилятор не удаляет неиспользуемые частные методы.

Существуют способы использования метода без знаний компилятора, например, с отражением. Поэтому компилятор не пытается угадать. Он просто оставляет методы там.

Единственными частными методами, которые удаляет компилятор, являются частичные методы без реализации.

Для оптимизации компилятора С# посмотрите здесь.

Ответ 2

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

Существует множество фреймворков (например, анализатор XAML), которые позволяют вам вызывать частные методы без статических привязок (подумайте о OnClick = "myFunction" в файле XAML). Эта разметка вызовет потенциально закрытый myFunction, когда событие OnClick возникает... Но компилятор не имеет информации о таком поведении во время компиляции.

Динамический код страдает от той же проблемы, генерация IL тоже. И вы можете получить доступ к закрытым методам из любого объекта при выполнении полного доверия.

Ответ 3

Нет, они не будут удалены. Это может дать вам предупреждение за это, но не сделает это сам.

Ответ 4

Эта оптимизация эффективно реализуется на уровне JIT, что хорошо, потому что тогда она работает как для общедоступных, так и для частных/любых методов. Если метод никогда не вызывается (игнорируя ngen и т.д.), Он никогда не получает JITed. Теперь вы можете сказать, что это все еще пустая трата пространства для метаданных и т.д., Но, как указывали другие, частные не настолько частные.