In this tutorial, you will learn how to use C# preprocessor directives.
The preprocessor directives give instruction to the compiler to preprocess the information before actual compilation starts.
- C# preprocessor directive begins with a # (hash) symbol.
- A preprocessor directive must be the only instruction on a line.
- C# Preprocessor directives are not statements, so they do not end with a semicolon (;).
C# Preprocessor Directives
- #define
- #undef
- #if
- #elif
- #else
- #endif
- #warning
- #error
- #line
- #region
- #endregion
- #pragma
Conditional Compilation
Use #define to define symbol and #if will evaluate it true if the symbol was defined.
#define HELLO
using System;
#if HELLO
Console.WriteLine("Defined HELLO symbol");
#endif
DefineContants
The DefineConstants option defines symbols in all source code files of your program.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<DefineConstants Condition=" '$(IsTest)' == 'true' ">$(DefineConstants);TEST</DefineConstants>
<DefineConstants>$(DefineConstants);NEW_TEST</DefineConstants>
</PropertyGroup>
</Project>
Program.cs
#define HELLO
using System;
using HelloWorld;
#if HELLO
Console.WriteLine("Defined HELLO symbol");
#endif
TestClass test = new TestClass();
test.TestMethod();
TestClass.cs
using System;
namespace HelloWorld
{
public class TestClass
{
public void TestMethod()
{
#if HELLO
Console.WriteLine("There is HELLO preprocessor directive.");
#endif
#if TEST
Console.WriteLine("There is TEST preprocessor directive.");
#else
Console.WriteLine("There are no TEST preprocessor directives");
#endif
#if DEBUG
Console.WriteLine("There is DEBUG preprocessor directive.");
#else
Console.WriteLine("There are no DEBUG preprocessor directives");
#endif
#if TRACE
Console.WriteLine("There is TRACE preprocessor directive.");
#else
Console.WriteLine("There are no TRACE preprocessor directives");
#endif
#if NEW_TEST
Console.WriteLine("There is NEW_TEST preprocessor directive.");
#else
Console.WriteLine("There are no NEW_TEST preprocessor directives");
#endif
}
}
}
Run application with command: dotnet run and get output:
Defined HELLO symbol
There are no TEST preprocessor directives
There is DEBUG preprocessor directive.
There is TRACE preprocessor directive.
There is NEW_TEST preprocessor directive.
Passing Define Constants from dotnet CLI
Run dotnet build command:
dotnet build -p:IsTest=true;
And then run the built dll with command:
dotnet ./bin/Debug/net5.0/HelloWorld.dll
Output:
Defined HELLO symbol
There is TEST preprocessor directive.
There is DEBUG preprocessor directive.
There is TRACE preprocessor directive.
There is NEW_TEST preprocessor directive.
DefineConstants Variable
Following are another sample for defining a symbol variable in project file, and then pass the symbol from CLI when build.
.csproj file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<DefineConstants Condition=" '$(extraDefineConstants)' != '' ">$(DefineConstants);$(extraDefineConstants)</DefineConstants>
</PropertyGroup>
</Project>
code snippet:
#define HELLO
using System;
#if PASS_FROM_CLI
Console.WriteLine("This is passed from extra DefineConstants.");
#else
Console.WriteLine("This are no passed from extra DefineConstants.");
#endif
build with following command:
dotnet build -p:extraDefineConstants=PASS_FROM_CLI
run with following command:
dotnet ./bin/Debug/net5.0/HelloWorld.dll
Output:
This is passed from extra DefineConstants.
Summary
In this tutorial, you have learn how to use C# preprocessor directives, especially how to use DefineConstants.