При компиляции вы можете установить флаги компилятора, которые вы можете использовать для помещения кода в эти директивы. Этот код не будет скомпилирован и никогда не попадет в окончательный результат сборки. DEBUG - один из предопределенных, но вы можете использовать свой собственный.
В качестве примера использования: в одной из текущих разработок мы используем флаг компилятора, чтобы указать, следует ли использовать маску входа в систему для входа в систему пользователя или вход в систему должен происходить автоматически с текущим участником. Второй режим предназначен только для разработчиков, например. отладка быстрее без входа в систему.
Другой пример: в некотором монокоде вы увидите флаги. В этом случае код может быть скомпилирован по-разному, например, когда предназначается для другой структуры, поскольку она использует классы, которые могут не существовать в более ранних выпусках.
С этим связан Условный -атрибут, с помощью которого можно пометить метод. Если указанный флаг не установлен, вызовы метода не будут выполняться. Метод все еще заканчивается в IL, но вызовы будут удалены.
Проверьте, например, следующий код:
var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList();
var attribs = mthods[0].GetCustomAttributes(true);
Вы заметите, что к методу Debug.WriteLine применен атрибут Conditional: вызовы к нему будут удалены при компиляции БЕЗ флага компилятора DEBUG.