懒属性初始化静态类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,所以抛出了异常。
这段代码有什么问题?
感谢
的快速和肮脏的修复程序,这将是这样做:
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());
Lazy
需要一个函数,当你第一次尝试时会被执行要访问Value
,但在您的代码中,您传递的是null
,因为您尚未初始化LoggerFactory
。您的类中的静态初始化程序将在第一次访问任何静态字段之前运行,因此尝试访问LoggerFactory
将触发您的_log
字段初始化(如果尚未),则LoggerFactory
为空。有关静态初始化的一些讨论,请参阅here。
您可以推迟访问LoggerFactory
,但将其封装在函数中。
现在很清楚,谢谢@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将保留为空
感谢您的解释,现在我明白了执行命令。 – abx78
因为当你创建'_log','LoggerFactory'为空。当您执行'Logger.LoggerFactory = ...'时,您已经初始化了'_log' –
您可以尝试:'private static readonly Lazy _log = new Lazy (()=> LoggerFactory());' –