gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:33:32 30 4
gpt4 key购买 nike

我得到了这个代码

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。

这段代码有什么问题?

谢谢

最佳答案

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

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

Lazy 采用一个函数,该函数将在您首次尝试访问 Value 时执行,但在您的代码中您将其传递给它 null因为你还没有初始化 LoggerFactory。您类中的静态初始化程序将在第一次访问任何静态字段之前运行,因此您尝试访问 LoggerFactory 将触发您的 _log 字段初始化(如果它还没有)此时 LoggerFactory 为空。参见,例如,here有关静态初始化的一些讨论。

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

关于c# - 静态类 C# 中的惰性属性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616121/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com