Pull to refresh

Выключка кода комментарием: маленький лайфхак

Reading time 2 min
Views 5.3K
Несмотря на простоту (и, в общем-то, тривиальность, если подумать) описываемого решения, наткнулся на него чисто случайно, во время разукрашивания комментарием законченной программы, готовой к сдаче.

В программистской практике регулярно случается ситуация, когда на время разработки и отладки требуется включать какой-то код и выключать другой. Это несложно делать специальными конструкциями типа #if true ... #else ... #endif, меняя true на false, или прибегая к более изощренным условиям. Однако такая конструкция не позволяет создавать более двух альтернативных участков кода.

В языках, поддерживающих комментарий типа /* ... */ c помощью слегка нестандартной конструкции /**/ ... /*/ ... /*/ ... /**/ можно создавать сколько угодно чередующихся участков кода, которые будут попеременно включаться и выключаться одним лишь пробелом в первом (стартовом) из комментариев.

Например:

/**/
        Console.Write("1");
/*/
        Console.Write("2");
/*/
        Console.Write("3");
/*/
        Console.Write("4");
/**/
        Console.Write("5");

При выполнении этот код выведет в консоль строку "135". То есть, будут выполнены все нечетные операторы вывода — и последний, находящийся уже за пределами всей конструкции. Но если в стартовом комментарии между второй звездочкой и слешем вставить пробел (или, строго говоря, любой символ, кроме звездочки), то тот же самый код выведет строку "245": будут выполнены только четные операторы, и, опять же, последний, который уже за пределами. (UPD: благодарю FluffyMan за указание на ошибку).

Синтаксис комментариев-разделителей предельно строг: к конструкции /*/ ничего ни убавить, ни прибавить нельзя, это разрушит ее функционал. Синтаксис стартового и стопового комментария напротив совершенно произволен. Он может быть минималистичен до /**/, а может содержать какие угодно — легальные в смысле языка — комментарии. Откуда ясно, что стартовый и стоповый комментарии строго обязательны, и что внутри самой конструкции просто так использовать легальный комментарий типа /* ... */ нельзя, т.к. он тут же станет стоповым для всей предыдущей последовательности комментариев-разделителей /*/, и стартовым для всей последующей их последовательности. Но осмысленное использование таких вставок может оказаться полезным.

Однострочные комментарии // на функционал не влияют.

Dixi :)
Tags:
Hubs:
-16
Comments 33
Comments Comments 33

Articles