首页 > 解决方案 > 在 ASP .NET 中使用静态类初始化另一个静态类的成员

问题描述

无论如何,静态类是否可以使用来自不同命名空间的另一个静态类中设置的值来初始化它的一些成员?反正有没有规定他们建立的顺序?

例如

namespace Utility
{
    using Config;

    public static class Utility
    {
        public static UtilityObject myUtil = new UtilityObject(ConfigContext.myValue)
    }
}
...
// somewhere in a different file/project
...
namespace Config
{
    public static class ConfigContext
    {
        public static string myValue => ConfigurationManager.AppSettings["key"];
    }
}

这是我试图完成的基本模式的简化示例;我想获取加载到的配置文件中的值static class ConfigContext,并使用它们来初始化static class Utility.

标签: c#asp.netstatic-classes

解决方案


您不能指定静态初始化的顺序。但是你可以通过延迟初始化使用惰性逻辑来完全避免这个问题。

public static class Utility
{
    private static Lazy<UtilityObject> _myUtil = null;

    private static Utility()
    {
        _myUtil = new Lazy<UtilityObject>( () => new UtilityObject(ConfigContext.myValue) );
    }

    public static myUtil => _myUtil.Value;
}

使用这种技术,实用程序对象在实际使用之前不会被初始化。

如果初始化的逻辑ConfigContext有类似的问题,您也可以在那里使用 Lazy,并且您的所有惰性字段都将以级联方式按照需要的顺序进行初始化。


推荐阅读