Препроцессор C # - PullRequest
       44

Препроцессор C #

20 голосов
/ 01 сентября 2008

Хотя спецификация 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 #? Есть ли один, который делает простые вещи, которые я хочу сделать?

Ответы [ 11 ]

0 голосов
/ 01 сентября 2008

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

Я не уверен, что есть большой спрос на подобные вещи.

...