【问题标题】:What is the difference between a static readonly and a static field?静态只读和静态字段有什么区别?
【发布时间】:2016-08-31 19:53:38
【问题描述】:

所以,为了提供一些上下文,因为这总是有帮助的,我们正在使用 LightInject、Log4Net 和 Common.Logging。如果我们将记录器初始化为:

public static ILog Logger = LogManager.GetLogger<someType>();

记录器在第一次实例化类时工作(通过 LightInject),之后似乎再也没有记录(或者它甚至可能第一次不记录,有时很难说)。

如果我们把那行改成这个(注意细微的差别)它总是有效的。

public static readonly ILog Logger = LogManager.GetLogger<someType>();

所以...我知道静态只读只能为类初始化设置一次,并且可以像我们正在做的那样设置,也可以在静态构造函数中设置。但是,如果我们不将它设为只读,为什么它会“丢失”记录器呢?

【问题讨论】:

  • 我的猜测是它被某种方式覆盖了,可能是被 LightInject 覆盖了。用这里的东西是不可能的。您可以尝试将其设置为属性并在 setter 上设置断点。
  • 您也可以尝试将其设为受保护或私有,我知道在 Castle.Windsor 的情况下它只能注入公共成员。
  • 查看answer
  • 是什么让您认为记录器会丢失?
  • @hvd 很抱歉我的迂腐失误。

标签: c# .net


【解决方案1】:

将变量转换为属性

private static ILog _logger = LogManager.GetLogger<someType>();

public static ILog Logger {
  get{return _logger;}
  set {_logger=value;}
}

然后在set 行放置一个breakpoint

当应用程序中断时观察调用堆栈

添加更多信息:

  • 第一次设置时,将_logger 变量放在监视窗口中。
  • 然后右键选择make object id;
  • 这将为您提供对它的 #1 内存引用
  • 然后将#1 添加到您的监视列表中。

如果将来_logger 停止引用 #1,则表示它已更改!

【讨论】:

  • 虽然这些是有用的调试技巧,但这并不能回答问题。
  • 按照这些调试技巧将找出罪魁祸首并了解它是否是 LightInject
  • 以前的 IOC 容器也发生过,因此它不依赖于 LI。此外,LI 不会注入这些。
猜你喜欢
  • 2016-08-29
  • 2013-07-21
  • 2015-06-28
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2011-04-23
  • 2014-07-29
  • 2018-11-23
相关资源
最近更新 更多