Директивы препроцессора C#
Директивы препроцессора C#
В этом руководстве мы узнаем о директивах препроцессора, доступных директивах в C#, а также о том, когда, почему и как они используются.
Как следует из названия, директивы препроцессора представляют собой блок операторов, который обрабатывается до начала фактической компиляции. Директивы препроцессора C# — это команды для компилятора, влияющие на процесс компиляции.
Эти команды определяют, какие разделы кода компилировать или как обрабатывать определенные ошибки и предупреждения.
Директива препроцессора C# начинается с # (hash)
символ и все директивы препроцессора занимают одну строку. Директивы препроцессора завершаются new line
а не semicolon
.
Директивы препроцессора, доступные в C#:
Директива препроцессора | Описание | Синтаксис |
---|---|---|
#if | Проверяет, истинно ли выражение препроцессора | #if preprocessor-expression code to compile #endif |
#elif | Используется вместе с #if для проверки нескольких выражений препроцессора | #if preprocessor-expression-1 code to compile #elif preprocessor-expression-2 code to compile #endif |
#else | Используется вместе с #if для создания составной условной директивы. | #if preprocessor-expression code to compile #elif code to compile #endif |
#endif | Используется вместе с #if для обозначения конца условной директивы | #if preprocessor-expression code to compile #endif |
#define | Используется для определения символа | #define SYMBOL |
#undef | Используется для отмены определения символа | #undef SYMBOL |
#warning | Позволяет нам генерировать предупреждение уровня 1 из нашего кода | #warning warning-message |
#error | Позволяет нам генерировать ошибку из нашего кода | #error error-message |
#line | Позволяет изменить номер строки компилятора и имя файла для отображения ошибок и предупреждений | #line line-number file-name |
#region | Позволяет создать область, которую можно развернуть или свернуть при использовании редактора кода Visual Studio | #region region-description codes #endregion |
#endregion | Указывает на конец региона | #region region-description codes #endregion |
#pragma | Дает компилятору специальные инструкции для компиляции файла, в котором он появляется. | #pragma pragma-name pragma-arguments |
директива #define
#define
директива позволяет нам определить символ.- Символы, определяемые при использовании вместе с
#if
директива будет оценена как истина. - Эти символы можно использовать для указания условий компиляции.
- Синтаксис:
#define SYMBOL
- Например:
#define TESTING
Здесь ТЕСТИРОВАНИЕ является символом.
директива #undef
#undef
директива позволяет отменить определение символа.- Неопределенные символы при использовании вместе с
#if
директива будет оцениваться как false. - Синтаксис:
#undef SYMBOL
- Например:
#undef TESTING
Здесь ТЕСТИРОВАНИЕ является символом.
директива #if
#if
используются для проверки выражения препроцессора.- Выражение препроцессора может состоять только из символа или комбинации символов вместе с такими операторами, как
&&
. (И),||
(ИЛИ),!
(НЕ). #if
за директивой следует#endif
директива.- Коды внутри
#if
директива компилируется, только если выражение проверено с помощью#if
оценивается как истина. - Синтаксис:
#if preprocessor-expression code to compile< #endif
- Например:
#if TESTING Console.WriteLine("Currently Testing"); #endif
Пример 1. Как использовать директиву #if?
#define CSHARP
using System;
namespace Directive
{
class ConditionalDirective
{
public static void Main(string[] args)
{
#if (CSHARP)
Console.WriteLine("CSHARP is defined");
#endif
}
}
}
Когда мы запустим программу, вывод будет таким:
CSHARP is defined
В приведенной выше программе CSHARP
символ определяется с помощью #define
директива в начале программы. Внутри Main()
метод, #if
используется для проверки того, соответствует ли CSHARP
правда или нет. Блок кода внутри #if
директива компилируется, только если CSHARP
определено.
директива #elif
#elif
используется вместе с директивой #if, которая позволяет нам создать составную условную директиву.- Он используется при тестировании нескольких выражений препроцессора.
- Коды внутри
#elif
директива компилируется, только если выражение протестировано с этим#elif
оценивается как истина. - Синтаксис:
#if preprocessor-expression-1 code to compile #elif preprocessor-expression-2 code-to-compile #endif
- Например:
#if TESTING Console.WriteLine("Currently Testing"); #elif TRAINING Console.WriteLine("Currently Training"); #endif
директива #else
#else
директива используется вместе с#if
директива.- Если ни одно из выражений в предыдущем
#if
и#elif
(если присутствуют) директивы верны, коды внутри#else
директива будет скомпилирована. - Синтаксис:
#if preprocessor-expression-1 code to compile #elif preprocessor-expression-2 code-to-compile #else code-to-compile #endif
- Например:
#if TESTING Console.WriteLine("Currently Testing"); #elif TRAINING Console.WriteLine("Currently Training"); #else Console.WriteLine("Neither Testing nor Training"); #endif
директива #endif
#endif
директива используется вместе с#if
директива для указания конца#if
директива.- Синтаксис:
#if preprocessor-expression-1 code to compile #endif
- Например:
#if TESTING Console.WriteLine("Currently Testing"); #endif
Пример 2:Как использовать условную директиву (if, elif, else, endif)?
#define CSHARP
#undef PYTHON
using System;
namespace Directive
{
class ConditionalDirective
{
static void Main(string[] args)
{
#if (CSHARP && PYTHON)
Console.WriteLine("CSHARP and PYTHON are defined");
#elif (CSHARP && !PYTHON)
Console.WriteLine("CSHARP is defined, PYTHON is undefined");
#elif (!CSHARP && PYTHON)
Console.WriteLine("PYTHON is defined, CSHARP is undefined");
#else
Console.WriteLine("CSHARP and PYTHON are undefined");
#endif
}
}
}
Когда мы запустим программу, вывод будет таким:
CSHARP is defined, PYTHON is undefined
В этом примере мы видим использование #elif
. и #else
директива. Эти директивы используются, когда необходимо проверить несколько условий. Кроме того, символы можно комбинировать с помощью логических операторов для формирования выражения препроцессора.
#предупреждающая директива
#warning
директива позволяет нам генерировать определяемое пользователем предупреждение первого уровня из нашего кода.- Синтаксис:
#warning warning-message
- Например:
#warning This is a warning message
Пример 3. Как использовать директиву #warning?
using System;
namespace Directives
{
class WarningDirective
{
public static void Main(string[] args)
{
#if (!CSHARP)
#warning CSHARP is undefined
#endif
Console.WriteLine("#warning directive example");
}
}
}
Когда мы запустим программу, вывод будет таким:
Program.cs(10,26): warning CS1030: #warning: 'CSHARP is undefined' [/home/myuser/csharp/directives-project/directives-project.csproj] #warning directive example
После запуска вышеуказанной программы мы увидим вывод, как указано выше. Текст представляет собой предупреждающее сообщение. Здесь мы генерируем определяемое пользователем предупреждающее сообщение, используя #warning
директива.
Обратите внимание, что операторы после #warning
также выполняются. Это означает, что #warning
директива не завершает работу программы, а просто выдает предупреждение.
директива #error
#error
директива позволяет нам генерировать определяемую пользователем ошибку из нашего кода.- Синтаксис:
#error error-message
- Например:
#error This is an error message
Пример 4:Как использовать директиву #error?
using System;
namespace Directive
{
class Error
{
public static void Main(string[] args)
{
#if (!CSHARP)
#error CSHARP is undefined
#endif
Console.WriteLine("#error directive example");
}
}
}
Когда мы запустим программу, вывод будет таким:
Program.cs(10,24): error CS1029: #error: 'CSHARP is undefined' [/home/myuser/csharp/directives-project/directives-project.csproj] The build failed. Please fix the build errors and run again.
Мы увидим некоторые ошибки, вероятно, как и выше. Здесь мы генерируем определяемую пользователем ошибку.
Еще одна вещь, на которую следует обратить внимание, это то, что программа будет завершена, а строка #error directive example
не будет напечатано, как это было в #warning
директива.
директива #line
#line
директива позволяет нам изменить номер строки и имя файла для ошибок и предупреждений.- Синтаксис:
#line line-number file-name
- Например:
#line 50 "fakeprogram.cs"
Пример 5:Как использовать директиву #line?
using System;
namespace Directive
{
class Error
{
public static void Main(string[] args)
{
#line 200 "AnotherProgram.cs"
#warning Actual Warning generated by Program.cs on line 10
}
}
}
Когда мы запустим программу, вывод будет таким:
AnotherProgram.cs(200,22): warning CS1030: #warning: 'Actual Warning generated by Program.cs on line 10' [/home/myuser/csh arp/directive-project/directive-project.csproj]
Мы сохранили приведенный выше пример как Program.cs
. . Предупреждение фактически было сгенерировано в line 10
. по Program.cs
. Использование #line
директивы мы изменили номер строки на 200
и имя файла на AnotherProgram.cs
которая вызвала ошибку.
директива #region и #endregion
#region
директива позволяет нам создать область, которую можно развернуть или свернуть при использовании редактора кода Visual Studio.- Эта директива просто используется для организации кода.
- Блок #region не может пересекаться с блоком
#if
. блокировать. Однако#region
блок может быть включен в#if
блок и#if
блок может перекрываться с#region
блокировать. #endregion
указывает конец#region
блокировать.- Синтаксис:
#region region-description codes #endregion
Пример 6. Как использовать директиву #region?
using System;
namespace Directive
{
class Region
{
public static void Main(string[] args)
{
#region Hello
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
#endregion
}
}
}
Когда мы запустим программу, вывод будет таким:
Hello Hello Hello Hello Hello<час>
директива #pragma
#pragma
используется для предоставления компилятору специальных инструкций по компиляции файла, в котором она появляется.- Инструкция может включать отключение или включение некоторых предупреждений.
- C# поддерживает два
#pragma
инструкции:#pragma warning
:используется для отключения или включения предупреждений.#pragma checksum
:генерирует контрольные суммы для исходных файлов, которые будут использоваться для отладки.
- Синтаксис:
#pragma pragma-name pragma-arguments
- Например:
#pragma warning disable
- ул>
Пример 7:Как использовать директиву #pragma?
using System;
namespace Directive
{
class Error
{
public static void Main(string[] args)
{
#pragma warning disable
#warning This is a warning 1
#pragma warning restore
#warning This is a warning 2
}
}
}
Когда мы запустим программу, вывод будет таким:
Program.cs(12,22): warning CS1030: #warning: 'This is a warning 2' [/home/myuser/csharp/directive-project/directive-project.csproj]
Мы видим, что только второе предупреждение отображается на экране вывода.
Это связано с тем, что мы изначально отключили все предупреждения перед первым предупреждением и восстановили их только перед вторым предупреждением. Именно поэтому первое предупреждение было скрыто.
Мы также можем отключить конкретное предупреждение вместо всех предупреждений.
Чтобы узнать больше о #pragma
, посетите #pragma (справочник по C#).
Язык C