可以在生产源代码中使用这一行吗?它会产生什么样的性能损失?我知道 Debug.WriteLine 不会发送到使用发布配置构建的程序集。
ddiCatalogEntities.Database.Log = msg => Debug.WriteLine(msg);
此行应在 Debug模式下运行时将 Entity Framework 日志输出记录到 Visual Studio 调试控制台。
#if DEBUG
ddiCatalogEntities.Database.Log = msg => Debug.WriteLine(msg);
#endif
您更喜欢上面的解决方案吗?
最佳答案
首先,请注意您不能将普通委托(delegate)指向具有 ConditionalAttribute
的方法。
但是,您使用的是 lambda,因此可以编译。但它实际上编译成什么?
考虑这段代码:
Action<string> print = message => Debug.WriteLine(message);
print("TEST");
对于调试版本,编译为:
Action<string> print = delegate (string message) {
Debug.WriteLine(message);
};
print("TEST");
对于发布版本,它编译为:
Action<string> print = delegate (string message) {
};
print("TEST");
在这两种情况下,都会创建并调用一个委托(delegate) - 因此在这两种情况下,您都会有委托(delegate)创建和调用的开销(参数被压入堆栈),即使发布版本实际上没有做任何事情。
因此对于您的情况,使用或不使用 #if DEBUG
的区别如下:
- 如果您使用
#if DEBUG
则根本没有开销,并且不会设置Log
属性。 - 否则,您需要设置
Log
属性,然后在调用它时什么都不做。
在许多情况下,开销非常小,您不介意 - 而且确保 Log
属性始终设置为 something 也很好(默认到一个“什么也不做”的委托(delegate)),所以你不需要在每次引用它之前检查它是否为 null。
另一方面,#if DEBUG
的使用使发生的事情更加清晰。 lambda 和使用 ConditionalAttribute
定义的方法交互的方式并不十分明显!
所有这些都是迂回的说法:权衡利弊,做出自己的选择。 ;)
关于c# - 在生产源代码中将 Entity Framework 日志记录设置为调试窗口是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25400508/