Компилятор C # Smart Compilation - PullRequest
1 голос
/ 22 марта 2012

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

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

Например, вместо массивного метода (foo), который предоставляет какую-то одноразовую функцию, включаемую в один из файлов .cs для основного exe, я обернул его в его собственный класс и разделил так, чтобы онможет (теоретически) использоваться в других проектах или других частях решения.

IE, переходящий от этого:

/* somewhere in Main */
void Main ()
{
...
foo (arg1, arg2, arg3)
...
}

foo (arg1, arg2, arg3)
{
//some massive functionality
}

к этому:

/* somewhere in Main or any other part of the code base */
Foo myFoo = new Foo (arg1, arg2, arg3);
myFoo.DoSomething();

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

Мой вопрос таков: когдаЯ компилирую, достаточно ли умен компилятор C # (использующий версию 3.5), чтобы он не включал методы / функции / объекты / библиотеки, которые никогда не вызывались, не создавались и не использовались?из устаревших методов / функций, но мне просто интересно, может ли компилятор выводить выходные данные, которые не содержат эти методы / функции.

TL; DR : если у меня естьследующий Main.cs

/*using statements here*/
public void Main ()
{
  foo();
}

foo ()
{
  /*Some commands*/
}

bar()
{
  /*Never called*/
}

Содержит ли мой скомпилированный вывод какие-либо ссылки на bar?

1 Ответ

4 голосов
/ 22 марта 2012

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

Так что да, скомпилированный вывод определяет метод bar, а его тело скомпилировано и присутствует в вашем двоичном файле.

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

...