我需要帮助在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?
答案 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 ,因为一旦它们被初始化,您永远不会更改它们(或者至少你不想这样做),这就是我的建议。