惰性 属性 静态初始化 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 但将其包装在一个函数中。