вторник, 21 октября 2008 г.

#endregion-ы

Самая необычная конструкция в C#, по моему мнению, это деректива #region. Удивительно в ней то, что введена она в язык исключительно ради более удобной работы с исходным кодом. Компилятор, говоря языком стандарта, не налагает никакой семантики на "содержимое" региона.

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

Используютя регионы, зачастую, именно так, как показано в примере из MSDN:

// preprocessor_region.cs
#region MyClass definition

public class MyClass
{
  public static void Main()
  {
  }
}

#endregion

то есть начинаются как:

#region Какое-либо описание ("заголовок")

а заканчиваются:

#endregion

чему во многом этому способствует "стандартный" сниппет (находящийся в "Program Files\Microsoft Visual Studio 9.0\VC#\Snippets\1033\Visual C#\pp_region.snippet"), позволяющий в несколько нажатий клавиш вставить в редактор блок #region#endregion и ввести лишь "заголовок".

Директива #endregion, кажется, нужна лишь для того, что бы обозначить окончание региона и больше проку от неё нет. Но … это только на первый взгляд :о) она так же, как и #region может содержать информативное текстовое описание, а, значит, подсказывать, что же за код находится выше неё в редакторе и, часто, это очень полезно если "размер" региона больше одного экрана или просто не хочется высоко поднимать глаза, что бы увидеть, что же написано в заголовке региона. Главное, получить это можно практически бесплатно, если для вставки регионов вы пользуетесь code-snippets. Достаточно открыть в редакторе (хоть в той же MSVS) указанный выше файл pp_region.snippet и заменить

<Code Language="csharp">
   <![CDATA[#region $name$
 $selected$$end$
#endregion
]]>
</Code>

на

<Code Language="csharp">
   <![CDATA[#region $name$
 $selected$$end$
#endregion $name$
]]>
</Code>

Теперь у вас будут более информативные и даже более стройные регионы:

// preprocessor_region.cs
#region MyClass definition

public class MyClass
{
  public static void Main()
  {
  }
}

#endregion MyClass definition

Не забывайте: человек может читать или просто просматривать код не только "сверху вниз", но и "снизу вверх", и в таком случае указанный у #endregion коментарий послужит на пользу.

11 комментариев:

  1. Спасибо!
    Еще записи будут? :)

    ОтветитьУдалить
  2. Буду стараться. Тем "в голове" много, некоторым (как эта) уже несколько лет :о)

    Дело за наличием свободного времени, настроением и читателями. С первыми двумя пунктами, тьфу-тьфу-тьфу, наметились сдвиги :о)

    ОтветитьУдалить
  3. Я Ваш блог добавил в Google Reader, так что буду постоянным читателем. :)

    ОтветитьУдалить
  4. Спасибо, постараюсь оправдать оказанное…

    ОтветитьУдалить
  5. Тоже жду продолжения. Подписался на РСС.

    ОтветитьУдалить
  6. Немного флейма. Столкнулся с проблемкой. Есть стандартные snippets, а именно папка Refactoring, но пользоватся ими не получается.. как сделать так чтоб они были доступны в VS?

    ОтветитьУдалить
  7. 2 nauro: А как бы ты хотел пользоваться теми сниппетами? Они вызываются при выполнении команд рефакторинга. Если поломалось, то см. How to: Restore C# Refactoring Snippets.

    ОтветитьУдалить
  8. "Почему, когда я использую #region в коде у меня такое ощущение, что я вместо того чтобы убрать в комнате бардак, тупо прикрываю его одеялом и делаю вид что так и надо..." Отсюда.

    ОтветитьУдалить
  9. Интересно, не знал, меня тоже напрягало что по #endregion не понятно какой регион выше идет.

    ОтветитьУдалить
  10. С другой стороны человек может листать код и директиву с описанием относить к коду ниже, не обращая внимание на то, endregion это или region. В таком случае такое двойное описание будет сбивать :)

    ОтветитьУдалить