我使用了很多这样的行
Console.WriteLine("Test");
在VS 2010下调试应用程序。
我的问题是:在构建应用程序时,我是否对所有这些行进行了评论?
谢谢!
答案 0 :(得分:14)
是。事实上,如果你的应用程序是一个控制台应用程序,你真的想要执行这些行。查看您可能需要的System.Diagnostics.Debug
方法(例如Debug.WriteLine)。它们的输出位于Visual Studio的“输出”窗口中,它们在发布代码中不执行任何操作。
更一般地说,您可以通过执行以下操作来获得仅在Debug构建中编译的代码:
#if DEBUG
// Debug-only code here.
#endif
您还可以在方法定义之前放置this attribute来编写一个在执行发布版本时根本不调用的方法:
[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方法。正如我们所希望的那样,其他三个备选方案是“编译出”调试代码。
Debug版本如下所示:
.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
答案 1 :(得分:3)
是的,您的所有Console.WriteLine()
都将被编译为IL代码,从而嵌入到您的可执行文件中。
而不是Console.WriteLine()
使用一些日志框架,例如 log4net 或 NLog 。这些更容易配置和重用。
#if DEBUG .. #endif
答案 2 :(得分:2)
#define DEBUG
// ...
#if DEBUG
Console.WriteLine("Debug version");
#endif
答案 3 :(得分:1)
它是什么类型的应用程序?在控制台应用程序中,这是 输出到屏幕的方式。无论如何,答案是肯定的 - 它仍将被执行。是否有任何附加到控制台的问题是另一个问题。
您可能希望查看Debug.WriteLine()
,但可能有更好的方法(更不用说VS中的控制台非常慢)