Как использовать оператор If DEBUG в C # без кода мышления IDE, который недоступен? - PullRequest
1 голос
/ 25 февраля 2011

У меня есть код, который должен работать немного по-другому в режимах отладки и выпуска.У него есть константа с именем 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 s.
  • подавления CS0162 для других случаев - поскольку я считаю, что это предупреждение неоценимо при поиске неработающего кода.

Как использовать оператор #if DEBUG без IDE, считая, что весь следующий код недоступен?

Ответы [ 5 ]

2 голосов
/ 25 февраля 2011

Вы можете сделать следующее, чтобы обойти это.

Printer.PrettyPrint.Equals(true)
2 голосов
/ 25 февраля 2011

Хотя в настоящее время у меня нет идеи, как включить его в ваш код, вам может пригодиться ConditionalAttribute.Вы можете обойтись с помощью директив препроцессора, но вам, возможно, придется переделать свой код.

1 голос
/ 25 февраля 2011

Вы можете попробовать:

innerIndentation = Printer.PrettyPrint ? indentation + " " : "";

start = Printer.PrettyPrint ? "[\n" : "[";

end = Printer.PrettyPrint ? indentation + "]" : "]";

comma = Printer.PrettyPrint ? ",\n" + innerIndentation : ",";

Ноесли бы это был я, я бы просто использовал #if #else

1 голос
/ 25 февраля 2011

Вы можете изменить PrettyPrint на обычное поле вместо const.
Вы потеряете оптимизацию компилятора, но это не должно иметь значения.

Я почти уверен, что вы также можете сделать это readonly без предупреждения; попробуй.

0 голосов
/ 25 февраля 2011

Измените PrettyPrint из const в поле.

#if DEBUG          
    public bool PrettyPrint = true;  
#else 
    public bool PrettyPrint = false;  
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...