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

时间:2016-07-27 14:38:34

标签: 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
        }
    }
}

此静态类在应用程序中使用:

Logger.LoggerFactory = () => Logger.ConfigureLogging(AppName, AppVersion);
Logger.Instance.Information("Starting application");

我希望第一行设置LoggerFactory;但是,在第一次写入日志时,抛出异常,因为尚未设置静态Func LoggerFactory。

这段代码有什么问题?

由于

2 个答案:

答案 0 :(得分:4)

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

private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(() => LoggerFactory());

Lazy会在您第一次尝试访问Value时执行一项功能,但在您的代码中,您传递的内容为null,因为您尚未初始化LoggerFactory。您的类中的静态初始值设定项将在第一次访问任何静态字段之前运行,因此您尝试访问LoggerFactory会触发_log字段初始化(如果尚未初始化) )此时LoggerFactory为空。有关静态初始化的一些讨论,请参阅here

您可以推迟访问LoggerFactory,但将其包装在函数中。

答案 1 :(得分:3)

这是执行顺序:

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