Оптимизация компилятора C # - Неиспользуемые методы - PullRequest
16 голосов
/ 05 марта 2011

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

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

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

РЕДАКТИРОВАТЬ:

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

Ответы [ 4 ]

22 голосов
/ 05 марта 2011

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

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

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

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

8 голосов
/ 05 марта 2011

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

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

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

2 голосов
/ 05 марта 2011

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

2 голосов
/ 05 марта 2011

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

...