Сегрегация кода отладки и выпуска в С#

Я пишу приложение, в котором у меня есть код отладки, который я не хочу удалять, но я хочу, чтобы он был изменен или удален при компиляции для выпуска/публикации. Например, я хотел бы что-то подобное в отладочной сборке:

MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

... чтобы это произошло в сборке релизов:

MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

В идеале я надеялся сделать что-то вроде этого:

#if DEBUG_BUILD
   MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
#else
   MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif

Я бы предпочел не добавлять/удалять условный символ компиляции в свойствах проекта каждый раз, когда я изменяю тип сборки; это должно произойти автоматически. Есть ли способ сделать это в Microsoft Visual С# 2008 Express Edition? Спасибо.

Ответ 1

Использование:

#if DEBUG
  // Debug work here
#else
  // Release work here
#endif

Если вы это сделаете, просто включите переключатель "Define DEBUG Constant" на страницах свойств (страница сборки свойств проекта), и он будет работать. По умолчанию для новых проектов С# установлено значение true. DEBUG будет определен для вас (по умолчанию) компилятором С#.

Ответ 2

Вы также можете использовать этот атрибут.

[Conditional("DEBUG")]

Это имеет несколько преимуществ перед директивой препроцессора.

Все вызовы методов, отмеченных как условные, будут заменены на Nops, если условный символ не определен, что избавляет вас от необходимости изменять все вызовы.

Ваш код будет проверяться на наличие ошибок, даже если символ не определен. (В отличие от использования #if DEBUG, который игнорирует код в #else во время компиляции)

Ответ 3

Существует класс, который вы можете использовать для написания своих отладочных инструкций пространство имен: system.diagnostics Debug.Assert - это то, что вы хотите использовать

http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert.aspx

Также посмотрите класс Debug для всей отладки: http://msdn.microsoft.com/en-us/library/6x31ezs1.aspx

Ответ 4

Вы можете написать метод расширения, который содержит условное выражение, поэтому вам не нужно дублировать его каждый раз

public static class ExceptionExtensions
{
    public static String ToMyString(this Exception ex)
    {
#if DEBUG
        return ex.ToString();
#else
        return ex.Message;
#endif
    }
}

Вот как бы я это сделал

И тогда ваша строка кода будет

MessageBox.Show(ex.ToMyString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

И DEBUG должен быть определен уже

Ответ 5

Я не знаю, есть ли у экспресс-изданий это, но Visual Studio уже имеет встроенный для вас С#.

На панели инструментов у вас обязательно есть раскрывающийся список, который позволяет вам (по умолчанию) выбирать между сборкой debug и release, сборка отладки определяет символ DEBUG, поэтому вы можете использовать:

#ifdef DEBUG
    // debug code
#endif