В то время как спецификация С# содержит предустановочные и базовые директивы (#define, #if и т.д.), язык не имеет такого же гибкого предварительного процессора, что и на таких языках, как C/С++. Я считаю, что отсутствие такого гибкого препроцессора было конструктивным решением, сделанным Андерсом Хейльсбергом (хотя, к сожалению, я не могу найти ссылку на это сейчас). Из опыта это, безусловно, хорошее решение, так как были некоторые действительно ужасные не поддерживаемые макросы, созданные обратно, когда я делал много C/С++.
Тем не менее, существует ряд сценариев, в которых я мог бы найти немного более гибкий предварительный процессор, чтобы быть полезным. Кодекс, такой как следующий, может быть улучшен с помощью некоторых простых предпроцессорных директив:
public string MyProperty
{
get { return _myProperty; }
set
{
if (value != _myProperty)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
// This line above could be improved by replacing the literal string with
// a pre-processor directive like "#Property", which could be translated
// to the string value "MyProperty" This new notify call would be as follows:
// NotifyPropertyChanged(#Property);
}
}
}
Было бы неплохо написать предварительный процессор для обработки чрезвычайно простых случаев, подобных этому? Стив Макконнелл написал в Code Complete (p208):
Напиши свой собственный препроцессор. Если язык не содержит препроцессор, его довольно легко написать...
Я разорван. Это было дизайнерское решение оставить такой гибкий препроцессор из С#. Тем не менее, автор, которого я очень уважаю, упоминает, что в некоторых случаях может быть хорошо.
Должен ли я создать предварительный процессор С#? Есть ли доступный, который делает простые вещи, которые я хочу сделать?