2

我有一大段代码经常需要跟踪信息输出,以便客户可以帮助调试输出 - 它非常面向数学。

出于性能原因,我绝对不希望在生产中启用跟踪,但是必须经常评论它变得很麻烦。

我刚刚设置了这样的代码......

using System.Diagnostics;

const bool TRACING_ENABLED = false;

//math math math....

Trace.WriteLineIf(TRACING_ENABLED, "Minimum Nitrogen Yield: " + minYieldNitrogen);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Water Yield: " + minYieldWater);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Seed Yield: " + minYieldSeed);

//more math math trace math trace math...

我的问题是......这是启用和禁用跟踪以进行调试的最佳方法吗?这些类型的行分散在整个代码中,所以我希望不必if为了家务而在它们周围包装块或任何东西。

编译器是否会在程序集中优化这些行,因为它们是false在构建时提供的常量?

感谢您的洞察力!

4

4 回答 4

3

我会使用ConditionalAttribute和编译器标志来处理这个问题。

这具有从生产代码中完全删除方法的优点- 因此甚至不会发生条件检查。

这样做,您可以制作自己的方法,例如:

[Conditional("TRACE")]
public WriteTraceLine(string message)
{
     Trace.WriteLine(message);
}

然后TRACE在您的调试/非生产构建设置中有一个标志。当定义该标志时,这将导致该方法仅存在于编译源(包括调用)中。

于 2012-05-25T18:31:05.910 回答
2

我也会看看 Debug.WriteLine() 方法。所有的 Debug 方法都使用 Reed 的 Conditional 属性,而是基于“DEBUG”常量的定义(您可以在默认的 Debug 构建配置中免费获得,而在默认的 Release 构建配置中不存在)。Debug 方法使用与 Trace 相同的侦听器集合;这个想法是您使用 Trace.WriteLine() 来记录或显示在软件的任何版本中的任何内容,并使用 Debug.WriteLine() 来获取要在软件的 Debug 版本中记录或显示的其他文本。

于 2012-05-25T18:37:49.730 回答
0

而不是Trace.WriteLineIf(condition, message),使用Debug.WriteLine(message).

在 Debug 构建中,对该方法的调用会被正常编译。在发布版本中,编译器不会为调用发出代码,也不会为参数评估发出代码。如果我正确理解您的问题,这正是您想要的。

准确地说,Debug.WriteLine(message)有一个[ConditionalAttribute("DEBUG")]应用于它。DEBUG因此,当且仅当符号在编译期间定义时,编译器才会发出调用它的代码。此符号在标准 Visual Studio 调试版本中定义,但不在发布版本中定义。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/9z9k5ydzhttp://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx

于 2012-05-25T18:41:52.770 回答
0

也许您可以做的就是编写自己的课程

public class MyTrace 
{
     [Conditional("TRACE")]
     public static void Trace(string message)
     {
          //trace code goes here
     }
     [Conditional("DEBUG")] 
     public static void Debug(string message)
     {
          //Debug code goes here
     }
}

这样做的好处是您可以使用条件编译、添加配置逻辑甚至使用 Log4Net 之类的日志记录包

你当然会用

  ....
  MyTrace.Trace(".....");
  MyTrace.Debug(".....");
  ....
于 2012-05-25T18:49:58.423 回答