惰性 属性 静态初始化 class C#
Lazy Property Initialization in static class 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
}
}
}
此静态class在应用程序中使用:
Logger.LoggerFactory = () => Logger.ConfigureLogging(AppName, AppVersion);
Logger.Instance.Information("Starting application");
我希望第一行设置 LoggerFactory;然而,在第一次尝试写入日志时,由于尚未设置静态 Func 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 将保持为 null
快速而肮脏的解决方法是:
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());
Lazy
接受一个函数,当您第一次尝试访问 Value
时将执行该函数,但在您的代码中您正在传递它 null
因为您尚未初始化LoggerFactory
。 class 中的静态初始化程序将在第一次访问任何静态字段之前 运行,因此您尝试访问 LoggerFactory
将触发 _log
字段初始化(如果还没有)此时 LoggerFactory
为空。例如,有关静态初始化的一些讨论,请参阅 here。
您可以延迟访问 LoggerFactory
但将其包装在一个函数中。
我得到了这个代码
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
}
}
}
此静态class在应用程序中使用:
Logger.LoggerFactory = () => Logger.ConfigureLogging(AppName, AppVersion);
Logger.Instance.Information("Starting application");
我希望第一行设置 LoggerFactory;然而,在第一次尝试写入日志时,由于尚未设置静态 Func 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 将保持为 null
快速而肮脏的解决方法是:
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());
Lazy
接受一个函数,当您第一次尝试访问 Value
时将执行该函数,但在您的代码中您正在传递它 null
因为您尚未初始化LoggerFactory
。 class 中的静态初始化程序将在第一次访问任何静态字段之前 运行,因此您尝试访问 LoggerFactory
将触发 _log
字段初始化(如果还没有)此时 LoggerFactory
为空。例如,有关静态初始化的一些讨论,请参阅 here。
您可以延迟访问 LoggerFactory
但将其包装在一个函数中。