c# - 在生产源代码中将 Entity Framework 日志记录设置为调试窗口是否可以?

标签 c# entity-framework logging visual-studio-debugging

可以在生产源代码中使用这一行吗?它会产生什么样的性能损失?我知道 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/

相关文章:

c# - Authorize 和 AllowAnonymous 元数据在应用于 Controller 时会给出不同的行为

c# - 无限日期时间到 SqlDateTime

c# - Entity Framework 延迟加载的集合有时为空

C# 获取 SQL 日志

java - 将堆栈跟踪打印到文件中

c# - 如何在c#中使用kubernetes-client创建k8s部署?

C#字节数组转化为变量

entity-framework - EF Code first - 多对多关系映射表,带有额外的列

c# - 当 ViewModel 中的实体模型发生变化时更新 UI

xcode - 从控制台应用程序查看信息和调试日志