#define, #undef Определение (например, #define DEBUG) и отмена определения (#undef DEBUG) символьной константы, которая используется директивами условной компиляции. Директивы размещаются до первой лексемы единицы компиляции. Допускается повторное определение одной и той же константы
#if, #elif, Директивы условной компиляции. Код, находящийся в области их
# else, #endif действия, компилируется или пропускается в зависимости от того, была ли ранее определена символьная константа (см. далее) Задание номера строки и имени файла, о котором выдаются сообщения, возникающие при компиляции (например, #line 200 "ku_ku.txt"). При этом в диагностических сообщениях компилятора имя компилируемого файла заменяется указанным, а строки нумеруются, начиная с заданного первым параметром номера1
#еггог, Вывод при компиляции сообщения, указанного в строке директивы.
#warning После выполнения директивы #еггог компиляция прекращается
(например, #еггог Дальше компилировать нельзя). После выполнения директивы #warning компиляция продолжается
|
|
#region, Определение фрагмента кода, который можно будет свернуть или
#endregion развернуть средствами редактора кода. Фрагмент располагается между
этими директивами
#pragma Введена в версии С# 2.0. Позволяет отключить (#pragma warning disable) или восстановить (#pragma warning restore) выдачу всех или перечисленных в директиве предупреждений компилятора
Формат директив:
#if константное_выражение
…
[ #elif константное_выражение
… ]
[ #elif константное_выражение
... ]
[#else
… ]
#endif
Количество директив #elif произвольно. Исключаемые блоки кода могут содержать как описания, так и исполняемые операторы. Константное выражение может содержать одну или несколько символьных констант, объединенных знаками операций ==,!=,!, && и ||. Также допускаются круглые скобки. Константа считается равной true, если она была ранее определена с помощью директивы #define.
Пример применения директив приведен в листинге 12.4.
Листинг 12.4. Применение директив условной компиляции
// #define VAR1
// #define VAR2
using System;
namespace ConsoleApplication1
{
class Class1
{
#if VAR1
static void F(){ Console.WriteLine("Вариант 1"); }
#elif VAR2
static void F(){ Console.WriteLine("Вариант 2"): }
#else
static void F() { Console.WriteLine("Основной вариант"); }
#endif
static void Main()
{
F();
}
}
}
В зависимости от того, определение какой символьной константы раскомментировать, в компиляции будет участвовать один из трех методов F.
Директива #define применяется не только в сочетании с директивами условной компиляции. Можно применять ее вместе со стандартным атрибутом Conditional для условного управления выполнением методов. Метод будет выполняться, если константа определена. Пример приведен в листинге 12.5. Обратите внимание на то, что для применения атрибута необходимо подключить пространство имен System.Diagnostics.
|
|
Листинг 12.5. Использование атрибута Conditional
// #define VAR1
// #define VAR2
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Class1
{
[Conditional("VAR1")]
static void A() { Console.WriteLine("Выпопняется метод А"); }
[Conditional("VAR2")]
static void B() { Console.WriteLine("Выполняется метод В"); }
static void Main()
{
АО;
ВО;
}
}
}
В методе Main записаны вызовы обоих методов, однако в данном случае будет выполнен только метод В, поскольку символьная константа VAR1 не определена.