1

只有当应用程序在调试模式下运行时,我才需要记录消息。我找到了两种方法:

第一:需要记录时需要在任何地方写 3 行。但是,Logger 语句仅在编译时被禁用,这正是我需要的。Logger.Log 根本不会被执行。

#if DEV_ENV
        Logger.Log("Application started !"); // This line is grayed. Perfect !
#endif

public static void Log(string message)
{
    Debug.WriteLine(message);
}

第二:非常整洁。需要记录的地方只有一行代码。不确定是否执行 Logger.Log 语句。如果仅在编译时删除函数调用(与第一种方法相同。但是,现在确定代码行没有变灰),我想这样做。

Logger.Log("Application started !"); // This line is not grayed out. But, function is not called. So, confused whether its removed at compile time.

[Conditional("DEV_ENV")]
public static void Log(string message)
{
    Debug.WriteLine(message);
}

我担心性能差异。

4

3 回答 3

2

ConditionalAttribute的MSDN页面:

将 ConditionalAttribute 应用于方法向编译器指示不应将对该方法的调用编译为 Microsoft 中间语言 (MSIL),除非定义了与 ConditionalAttribute 关联的条件编译符号。

因此,正如它所说,方法调用在编译时被删除,与#if.

于 2011-07-04T08:29:16.803 回答
0

根据您的编译设置,您可以使用:

if (System.Diagnostics.Debugger.IsAttached)
   Logger.Log("Application started !"); 

或者,

#if DEBUG
    Logger.Log("Application started !"); 
#endif 
于 2011-07-04T08:33:48.180 回答
0

正如 George 指出的那样,如果应用了 Conditional 属性,则不会编译方法调用。这也意味着(与直接使用删除代码一样#If DEV_ENV)方法调用中包含的任何副作用也不会发生 - 与往常一样,关于日志代码中存在副作用的警告是有根据的:

public static void Main(String[] args)
{
    int i = 92;
    Log(string.Format("{0} became {1}", i++, i));
    Console.WriteLine(i);
    Console.ReadLine();
}

[Conditional("SKIP")]
private static void Log(string msg)
{
    Console.WriteLine(msg);
}

如果SKIP未定义,则此代码打印出92. 如果SKIP已定义,则打印92 became 93and 93

于 2011-07-04T08:40:22.213 回答