4

我使用了很多这样的行

Console.WriteLine("Test");

在 VS 2010 下调试应用程序。

我的问题是:我在构建应用程序时是否评论了所有这些行?

谢谢!

4

4 回答 4

14

是的。事实上,如果您的应用程序是一个控制台应用程序,那么您确实希望执行这些行。查看可能是您需要的System.Diagnostics.Debug方法(例如Debug.WriteLine )。它们的输出在 Visual Studio 的输出窗口中,它们在发布代码中什么也不做。

更一般地说,您可以通过执行以下操作获得仅在 Debug 构建中编译的代码:

#if DEBUG
// Debug-only code here.
#endif

您还可以将此属性放在您的方法定义之前,以编写一个在您进行 Release 构建时根本不调用的方法:

    [System.Diagnostics.Conditional("DEBUG")]

所有这些方法的优点是它们不应该影响生产代码的性能。

为了检查我给你的建议是否准确,我在发布模式下编译了以下内容:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello world!");

#if DEBUG
        Console.WriteLine("Inside #if block.");
#endif

        WriteLine("With ConditionalAttribute.");

        Debug.WriteLine("Debug.WriteLine.");
    }

    [Conditional("DEBUG")]
    public static void WriteLine(string line)
    {
        Console.WriteLine(line);
    }
}

然后我使用 IL Dissasembler 工具查看实际运行的内容:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  8
  IL_0000:  ldstr      "Hello world!"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret
} // end of method Program::Main

如您所见,仅调用了 Console.WriteLine 方法。正如我们所希望的,其他三个替代方案是从调试代码中“编译出”的。

调试版本如下所示:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       46 (0x2e)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world!"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ldstr      "Inside #if block."
  IL_0011:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0016:  nop
  IL_0017:  ldstr      "With ConditionalAttribute."
  IL_001c:  call       void ConditionalCompileTest.Program::WriteLine(string)
  IL_0021:  nop
  IL_0022:  ldstr      "Debug.WriteLine."
  IL_0027:  call       void [System]System.Diagnostics.Debug::WriteLine(string)
  IL_002c:  nop
  IL_002d:  ret
} // end of method Program::Main
于 2012-07-04T17:44:22.687 回答
3

是的,您的所有内容都Console.WriteLine()将被编译成 IL 代码,从而嵌入到您的可执行文件中。

而不是Console.WriteLine()使用一些日志框架,比如log4netNLog。这些更容易配置和重用。

日志框架相对于 Console.WriteLine 的优势

  • 从调试到生产日志记录的更改将需要在配置文件中进行一行更新
  • 您可以登录文件、控制台、数据库、xml,还可以发送电子邮件并做更多事情
  • 您还可以组合多个记录器,例如同时保存到文件和输出到控制台
  • 花哨的颜色控制台输出怎么样 - 配置文件中的几行
  • 易于禁用(配置文件中的一行更改)
  • 易于配置,看起来比#if DEBUG .. #endif
  • 您可以进行异步日志记录
  • 如果您将应用程序拆分为可重用的库和 UI(例如与 WPF 一起使用,而不仅仅是与控制台一起使用),则无需更改日志记录代码
于 2012-07-04T17:45:03.670 回答
2
#define DEBUG
// ...
#if DEBUG
    Console.WriteLine("Debug version");
#endif

http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

于 2012-07-04T17:45:01.370 回答
1

它是什么类型的应用程序?在控制台应用程序中,这是输出到屏幕的方式。无论如何,答案是肯定的——它仍然会被执行。控制台是否附加任何东西是另一个问题。

您可能想看看,Debug.WriteLine()但可能有更好的方法(更不用说控制台在 VS 中非常慢)

于 2012-07-04T17:45:35.400 回答