Как использовать оператор If DEBUG в C# без кода мышления IDE, который недоступен?
У меня есть код, который должен работать немного по-другому в режимах отладки и выпуска. Имеет постоянную PrettyPrint
это установлено в true
в некоторых режимах и false
в других, и я иногда меняю окружающих.
#if DEBUG
public const bool PrettyPrint = true;
#else
public const bool PrettyPrint = false;
#endif
// ...snip...
string start, end, comma, innerIndentation;
if (Printer.PrettyPrint) {
innerIndentation = indentation + " ";
start = "[\n";
end = indentation + "]";
comma = ",\n" + innerIndentation;
} else {
innerIndentation = "";
start = "[";
end = "]";
comma = ",";
}
// Then do some prints using the initialized strings as constants
Это прекрасно работает, и компилятор достаточно умен, чтобы оптимизировать if
далеко. Тем не менее, я получаю раздражающее предупреждение:
warning CS0162: Unreachable code detected
Есть ли способ избежать этого предупреждения, не выполнив одно из следующих действий:
- с помощью
#if
непосредственно в коде - поскольку это делает эту часть кода довольно уродливой, и я хотел бы избежать#if
как можно больше. - подавление CS0162 для других случаев - поскольку я считаю, что это предупреждение неоценимо при поиске неработающего кода.
Как мне использовать #if DEBUG
заявление без IDE, полагая, что весь следующий код недоступен?
5 ответов
Вы можете попробовать:
innerIndentation = Printer.PrettyPrint ? indentation + " " : "";
start = Printer.PrettyPrint ? "[\n" : "[";
end = Printer.PrettyPrint ? indentation + "]" : "]";
comma = Printer.PrettyPrint ? ",\n" + innerIndentation : ",";
Но если бы это был я, я бы просто использовал #if
#else
Вы можете сделать следующее, чтобы обойти это.
Printer.PrettyPrint.Equals(true)
Хотя в настоящее время у меня нет идеи, как включить его в ваш код, вы можете найти ConditionalAttribute
полезно. Вы можете обойтись с использованием директив препроцессора, но вам, возможно, придется переделывать свой код.
Вы могли бы изменить PrettyPrint
в нормальное поле вместо const
,
Вы потеряете оптимизацию компилятора, но это не должно иметь значения.
Я уверен, что вы могли бы сделать это readonly
без получения предупреждения; попытайся.
Измените PrettyPrint с const на поле.
#if DEBUG
public bool PrettyPrint = true;
#else
public bool PrettyPrint = false;
#endif