静态类C#中的Lazy属性初始化
本文关键字:属性 初始化 Lazy 中的 静态类 | 更新日期: 2023-09-27 17:59:05
我收到了这个代码
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;然而,在第一次尝试写入日志时,由于尚未设置静态FuncLoggerFactory,因此引发了异常。
这个代码出了什么问题?
感谢
快速而肮脏的解决方法是这样做:
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());
Lazy
接受一个函数,该函数将在您第一次尝试访问Value
时执行,但在您的代码中,由于尚未初始化LoggerFactory
,您正在传递它null
。类中的静态初始值设定项将在第一次访问任何静态字段之前运行,因此尝试访问LoggerFactory
将触发_log
字段进行初始化(如果尚未初始化),此时LoggerFactory
为null。例如,有关静态初始化的一些讨论,请参见此处。
您可以推迟访问LoggerFactory
,但将其封装在函数中。
以下是执行顺序:
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将保持为空