Как использовать оператор 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
Другие вопросы по тегам