帮助c#中的静态构造函数

时间:2010-10-07 17:01:05

标签: c# .net

我需要帮助在c#中初始化静态只读变量。我有一个有这个签名的课程

public class AgentDescriptions
{
   public static readonly int P1;
   public static readonly int P2;

   static AgentDescriptions()
   {
      int agencyID = 1; //I need to pass this in the constructor somehow
      P1 = GetIDFromDB(agencyID);
      P2 = GetIdFromDB(agencyID);
   }
}

P1和P2在应用程序中反复使用 我试图避免两件事。 1)每次我需要使用P1和P2时,幻数和2)跳转到DB。

在应用程序中,我以这种方式在很多地方使用它们

if (something == AgentDescriptions.P1)
   //Blah();

请帮忙。如何在静态构造函数中传递agencyID?如果我添加另一个构造函数并在那里传递agencyID,我每次使用它时都必须初始化该类吗?这是否意味着每次都要去DB?

8 个答案:

答案 0 :(得分:5)

为什么这个类是静态的。如果您将变量传递给构造函数,则表示对象的实例具有状态,而不是类。

我只使用可用的get方法使变量成为私有成员变量。然后你有一个构造函数,它接受代理ID并设置这两个变量。如果需要维护此类型的单个实例,则使用单例(类中的静态函数存储对象的单个实例,或者如果尚不存在则创建新对象)。另一方面,如果您需要具有不同代理商ID的多个对象,您已经有了一种机制来实现这一目标。

答案 1 :(得分:2)

我会这样做:

public static class AgentDescriptions
{
  public static int P1 { get; private set; }
  public static int P2 { get; private set; }

  public static void Initialize(int AgencyId)
  {
      P1 = GetIDFromDB(AgencyId);
      P2 = GetIDFromDB(AgencyId);
  }
}

如果你想锁定它,那么Initialize只能被调用一次,那么你可以很容易地使用一个标志,在调用Initialize之后抛出异常(或其他)。

答案 2 :(得分:2)

听起来你真的想要一个缓存。

public class AgentDescriptions
{
    static Dictionary<int,int> agentCache = new ...;
    public static int GetP1(int agentID)
    {
       if (!agentCache.ContainsKey(agentID))
          agentCache.Add(agentID, GetIdFromDB(agencyID));

       return agentCache[agentID];
    }

    ...

答案 3 :(得分:1)

您不需要初始化程序(静态构造函数)。如果agencyId是整数,请尝试此

public static class AgentDescriptions  
{ 
   private static readonly Dictionary<int, int> dic
        = new Dictionary<int, int>();
   public static int GetId(int agencyId)
   {
       if (!dic.ContainsKey(agencyId))
            Adic.dd(agencyId, GetIDFromDB(agencyID));
       return dic[agencyId];
   }
 // ...

并像这样使用它:

   if (something == AgentDescriptions.GetId(agencyId)) 
   //Blah(); 

或者,如果agencyId是一个字符串,或者你想使用像“P1”,“P2”等字符串作为键,那么

public static class AgentDescriptions 
{ 
   private static readonly Dictionary<string, int> dic
        = new Dictionary<string, int>();

   public static int GetId(string agencyId)
   {
       if (!dic.ContainsKey(agencyId))
           Adic.dd(agencyId, GetIDFromDB(agencyID));
       return dic[agencyId];
   }
 // ...

并像这样使用它:

   if (something == AgentDescriptions.GetId("P1") 
   //Blah(); 

如果修复了代理商列表,您可以添加预先配置的静态成员来检索这些代理商的ID ...

public static class AgentDescriptions
{
    private static readonly Dictionary<string, int> dic
        = new Dictionary<string, int>();
    public static int P1 { get { return GetId("P1"); } }
    public static int P2 { get { return GetId("P2"); } }
    public static int P3 { get { return GetId("P3"); } }
    public static int GetId(string agencyId)
    {
        if (!dic.ContainsKey(agencyId))
            dic.Add(agencyId, 12);
        return dic[agencyId];
    } 

并像这样使用它:

   if (something == AgentDescriptions.P1) 
   //Blah(); 

答案 4 :(得分:1)

会尝试这样的事情......

int p1 = -1; //Or some impossible value.  This could also be a int? and left as null until it is initialized.
public static int P1
{
    get //Define only the 'get' of the property for this to make it readonly
    {
        if (p1 == -1)
           //Insert Code to get & assign the value of p1 from your DB.
        return p1;
    }
}

答案 5 :(得分:1)

这里有一些类似的单身人士问题。

class AgentDescriptions 
{
    AgentDescriptions()
    {
        P1 = GetIDFromDB(agencyID);
        P2 = GetIdFromDB(agencyID);
    }
    static public AgentDescriptions Instance 
    {
        get 
        {
            if (_instance==null)
            {
                _instance=new AgentDescriptions();
            }
            return _instance;
        }
    }
    static private _instance;
}

并使用

获取结果
int x=AgentDescriptions.Instance.P1;

查看:

How to restrict user for checking null for singelton instance in C#, .NET?

我经常将这种模式用于配置或常量项目。

答案 6 :(得分:1)

使用像AgencyID这样的UID意味着您将拥有一个对象的多个实例。静态意味着您只获得一个对象。删除静态关键字并创建对象的实例。

答案 7 :(得分:0)

由于您尝试在静态字段/属性中传递一些值,然后访问它们,我们可能会将静态类属性视为关于 SINGLETON ,因为一旦它们被初始化,您永远不会更改它们(或者至少你不想这样做),这就是我的建议。