Это инструкции компилятору, которые позволяют контролировать компиляцию частей кода.
<br>
**defines** - тип директивы препроцессора. Он позволяет создать условия, определяющие будет ли скомпилирован тот или иной участок кода.
Можно использовать только условия в синтаксисе директивы препроцессора (if, elif, else, endif)
```csharp
#if TEST1
#elif TEST2
#else
public string GetName()
{
return "Kate";
}
#endif
```
Если Define не определен, то код внутри условия проверяться не будет. Соответственно, будут игнорировать синтаксические ошибки кода.
```csharp
//Define TEST1 не определен, поэтому код не будет скомпилирован. Компилятор такой код перекрасил в серый цвет.
#if TEST1
pulic strng GetName(
{
rurn "Kate;
#endif
```
С более полной информацией, касательно директив препроцессора, можно ознакомиться в официальной [документации.](https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/preprocessor-directives)
<br>
### Unity
У Unity есть свои Define, которые позволяют видеть контекст при компиляции проекта. Например, запущена ли сборка в дебаг-режиме. Если сборка запущена в production, то Unity не определит define «Debug» и код не выполнится.
```csharp
public void Example()
{
#if DEBUG
Console.WriteLine("Debug version");
#endif
}
```
Все остальные Define, которые есть у Unity, можно посмотреть в официальной [документации](https://docs.unity3d.com/Manual/PlatformDependentCompilation.html).
### ConditionalAttribute Класс
Это Атрибут, который позволяет не компилировать метод/класс, если некий define не определен. ([Документация](https://learn.microsoft.com/ru-ru/dotnet/api/system.diagnostics.conditionalattribute?view=net-7.0))
```csharp
[Conditional("UNITY_IOS")]
public void IOS(string s) => Drive();
```