静态类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,因此引发了异常。

这个代码出了什么问题?

感谢

静态类C#中的Lazy属性初始化

快速而肮脏的解决方法是这样做:

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将保持为空