Хотя спецификация C # включает препроцессор и базовые директивы (#define, #if и т. Д.), Язык не имеет такого же гибкого препроцессора, как в таких языках, как C / C ++. Я считаю, что отсутствие такого гибкого препроцессора было дизайнерским решением, принятым Андерсом Хейлсбергом (хотя, к сожалению, сейчас я не могу найти ссылку на это). Исходя из опыта, это, безусловно, хорошее решение, так как были некоторые действительно ужасные необслуживаемые макросы, созданные еще тогда, когда я много занимался 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);
}
}
}
Будет ли хорошей идеей написать препроцессор для обработки таких простых случаев, как этот? Стив Макконнелл написал в Код завершен (p208):
Напишите свой собственный препроцессор Если язык не включает препроцессор, его довольно легко написать ...
Я разорван. Это было дизайнерское решение оставить такой гибкий препроцессор вне C #. Тем не менее, автор, которого я очень уважаю, упоминает, что в некоторых обстоятельствах это может быть нормально.
Должен ли я создать препроцессор C #? Есть ли один, который делает простые вещи, которые я хочу сделать?