abx*_*x78 2 c# lazy-evaluation
我得到了这个代码
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个静态类在应用程序中使用:
Logger.LoggerFactory = () => Logger.ConfigureLogging(AppName, AppVersion);
Logger.Instance.Information("Starting application");
Run Code Online (Sandbox Code Playgroud)
我希望第一行设置 LoggerFactory;但是,在第一次尝试写入日志时,由于尚未设置静态 Func LoggerFactory,因此引发了异常。
这段代码有什么问题?
谢谢
对此的快速而肮脏的解决方法是这样做:
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());
Run Code Online (Sandbox Code Playgroud)
Lazy接受一个将在您第一次尝试访问 时执行的函数Value,但是在您的代码中您正在传递它,null因为您还没有初始化LoggerFactory. 类中的静态初始值设定项将在第一次访问任何静态字段之前运行,因此您尝试访问LoggerFactory将触发您的_log字段初始化(如果尚未初始化),此时LoggerFactory为空。例如,请参阅此处了解有关静态初始化的一些讨论。
您可以推迟访问LoggerFactory但将其包装在一个函数中。