懒属性初始化静态类C#

懒属性初始化静态类C#

问题描述:

我一直在考虑这个代码懒属性初始化静态类C#

public static class Logger 
{ 
    public static Func<ILogger> LoggerFactory; 
    private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(LoggerFactory); 

    public static ILogger Instance 
    { 
     get 
     { 
      return _log.Value; 
     } 
     public static ILogger ConfigureLogging(string AppName, Version AppVersion) 
     { 
      // stuff 
     } 
    } 
} 

这个静态类应用程序中使用:

Logger.LoggerFactory =() => Logger.ConfigureLogging(AppName, AppVersion); 
Logger.Instance.Information("Starting application"); 

我希望第一行设置的LoggerFactory;然而,在写入日志的第一次尝试中,由于尚未设置静态Func LoggerFactory,所以抛出了异常。

这段代码有什么问题?

感谢

+1

因为当你创建'_log','LoggerFactory'为空。当您执行'Logger.LoggerFactory = ...'时,您已经初始化了'_log' –

+0

您可以尝试:'private static readonly Lazy _log = new Lazy (()=> LoggerFactory());' –

的快速和肮脏的修复程序,这将是这样做:

private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory()); 

Lazy需要一个函数,当你第一次尝试时会被执行要访问Value,但在您的代码中,您传递的是null,因为您尚未初始化LoggerFactory。您的类中的静态初始化程序将在第一次访问任何静态字段之前运行,因此尝试访问LoggerFactory将触发您的_log字段初始化(如果尚未),则LoggerFactory为空。有关静态初始化的一些讨论,请参阅here

您可以推迟访问LoggerFactory,但将其封装在函数中。

+0

现在很清楚,谢谢@MattBurland – abx78

这里是执行顺序:

private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(null); 
//LoggerFactory is null at this point 

Logger.LoggerFactory =() => Logger.ConfigureLogging(AppName, AppVersion); 
Logger.Instance.Information("Starting application"); 

,因此_log将保留为空

+0

感谢您的解释,现在我明白了执行命令。 – abx78