【问题标题】:Segregating Debug and Release Code in C#在 C# 中分离调试和发布代码
【发布时间】:2011-03-19 16:34:57
【问题描述】:

我正在编写一个应用程序,其中有一些我不想删除的 调试 代码,但我希望在编译发布/发布时对其进行修改或删除。例如,我想在调试版本中使用这样的东西:

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 C# 2008 Express Edition 中有没有办法做到这一点?谢谢。

【问题讨论】:

    标签: c# debugging release


    【解决方案1】:

    用途:

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

    如果您这样做,只需确保打开属性页面(项目属性的构建页面)中的“定义调试常量”切换,它就会起作用。对于新的 C# 项目,这默认设置为 true。 DEBUG 将由 C# 编译器(默认情况下)为您定义。

    【讨论】:

      【解决方案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

        【讨论】:

        • Debug.Assert 和这个问题有什么关系?
        • 用于显示消息不是,但如果他将代码用于调试,那么断言可能比显示消息框更有用。我正在展示您可以使用的更多高级选项
        【解决方案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 在 C# 中已经为你内置了这个。

        在您的工具栏中,您肯定有让您(默认情况下)在调试和发布版本之间进行选择的下拉菜单,调试版本定义了 DEBUG 符号,因此您可以使用:

        #ifdef DEBUG
            // debug code
        #endif
        

        【讨论】:

          猜你喜欢
          • 2018-06-29
          • 1970-01-01
          • 2013-03-08
          • 2011-05-07
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 2017-01-02
          相关资源
          最近更新 更多