我需要仅在应用程序在调试模式下运行时记录消息。我找到了两种方法:
首先:需要记录时,需要在任何地方写入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);
}
我担心性能差异。
答案 0 :(得分:2)
将ConditionalAttribute应用于 方法向编译器指示 a 不应该调用方法 编译到Microsoft中间件 语言(MSIL)除非有条件 与之关联的编译符号 与ConditionalAttribute一起定义。
因此,正如它所说,方法调用在编译时被删除,与#if
相同。
答案 1 :(得分:0)
根据您的编译设置,您可以使用:
if (System.Diagnostics.Debugger.IsAttached)
Logger.Log("Application started !");
或,
#if DEBUG
Logger.Log("Application started !");
#endif
答案 2 :(得分: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 93
和93
。