C# 具有只读属性的全局实例

C# 具有只读属性的全局实例,c#,static,global-variables,readonly,lazy-initialization,C#,Static,Global Variables,Readonly,Lazy Initialization,我想实现一个类,其实例是全局的,但其属性在运行时只初始化一次 此外,在执行过程中,初始化将作为函数结果的赋值来完成 基本上我想做这样的事情 public class Configuration { public string param1 { get ; set; } public int param2 { get; set; } } public static class AppConfig { public static readonly configurati

我想实现一个类,其实例是全局的,但其属性在运行时只初始化一次

此外,在执行过程中,初始化将作为函数结果的赋值来完成

基本上我想做这样的事情

public class Configuration
{
     public string param1 { get ; set; }
     public int param2 { get; set; }
}

public static class AppConfig
{
    public static readonly configuration;   
}

public class Initialize
{
    public void InitConfig()
    {
        AppConfig.configuration = GetParamsFromDB();
    }
}
但我不知道如何实施它。请忽略以上不正确的表述。这只是为了展示所需要的

编辑

此外,还需要单独的类初始化,因为类配置和AppConfig位于dll BO中。GetParamsFromDB()是DAL格式。达尔博
BO无法引用DAL,因此无法在AppConfig类中使用GetParamsFromDB()

看起来您需要一个单例

见:


这可以与一起使用,为所有需要它的对象提供配置。

您试图做的是一种单例模式,它可以实现如下:

public sealed class Configuration
{
   private static volatile Configuration instance;
   private static object syncRoot = new Object();

   private Configuration() {}

   public static Configuration Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Configuration();
            }
         }

         return instance;
      }
   }
}

您只需在线初始化它:

public static class AppConfig
{
    public static readonly configuration = GetParamsFromDB();   
}
C#运行时将自动确保在第一次访问该类之前不会初始化该参数,从而为您提供所需的参数


请注意,您的
配置
类型是可变的,如果您想确保这些值不被更改,这是一件坏事。您应该重构
配置
类,以接受其构造函数中的两个值,而不是为属性提供公共设置器。

当问题确实存在时,为什么要进行所有这些工作。这种模式更长,可读性差,性能差,更容易出错,在上下文中没有优势。你花时间链接到Jon的文章,然后甚至不使用他建议在这样的上下文中使用的解决方案……如果你在谈论懒惰,那么从文章中:“[…]实际上,您并不需要完全的惰性,除非您的类初始化做了一些特别耗时的事情,例如与数据库对话。但是,我已经有一段时间没有读过这篇文章了,我认为在这种情况下,单例不是一个好方法。与第四种解决方案相比,使用类似于
Lazy
的方法的唯一优点是,它允许您初始化一个静态字段,而不是另一个,这在只有一个静态字段时是不相关的。正如Jon自己所说,在这种情况下,您希望初始化一个字段而不是另一个字段是非常罕见的,这就是为什么第四个解决方案实际上总是足够懒惰的原因。感谢您的回复。我知道这个选项,但是设计是这样的,有BO项目和DAL项目。GetParamsFromDB将访问DAL,这将创建循环引用作为DAL引用。这就是为什么我想知道这个表达式本身是否可以写在其他地方,同时达到预期的结果。@nishantv如果这就是问题的症结所在,那么为什么问题本身没有提到这些呢?在任何情况下,解决方案都是,从一个项目引用的代码在另一个项目中确实属于另一个DLL。我已经更新了问题。我不希望将只表示属性的类从BO移动到另一个dl。但这是最后一个选择。
public sealed class Configuration
{
   private static volatile Configuration instance;
   private static object syncRoot = new Object();

   private Configuration() {}

   public static Configuration Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Configuration();
            }
         }

         return instance;
      }
   }
}
public static class AppConfig
{
    public static readonly configuration = GetParamsFromDB();   
}