假设我有一个巨大的定义列表,用于查找对象可以默认为“类型编号”的值。此类型编号是唯一的,并指向使用它初始化对象时将设置的数据。
我通常的选择是拥有一个静态属性,每次获取都会返回一个新的Dictionary。 E.g。
public static Dictionary<long, Tuple<string,DefaultValue>> Defaults
{
get { return new Dictionary<long, DefaultValue>()
{
{ 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
{ 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
...
}
}
}
这样做,并且查找列表可能永远不会大到足以显着影响性能或内存使用,但是对性能有点吝啬我不喜欢每个实例化一个新Dictionary
的想法它被引用的时间。我宁愿它完全硬编码到内存中。
如何以专业的方式解决这个问题?我觉得我上面这样做的方式令人难以置信的草率。
答案 0 :(得分:4)
您可以使用自动属性初始值设定项或在静态构造函数中设置值。后者如下所示。
static MyClass()
{
Defaults = new Dictionary<long, DefaultValue>(){
{ 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
{ 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
};
}
public static Dictionary<long, DefaultValue> Defaults {get; private set;}
使用自动属性初始化程序的示例(不需要静态构造函数,并且省略了私有集,因为现在可以假设您正在使用支持该的c#版本。)
public static Dictionary<long, DefaultValue> Defaults {get;} = new Dictionary<long, DefaultValue>(){
{ 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
{ 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
};
旁注:如果不应更改这些值,您还可以在属性上公开IReadonlyDictionary界面。
答案 1 :(得分:0)
如果查找表很小并且您的目标是提高查找操作的性能,那么您还可以考虑使用带有switch语句而不是查找字典的函数。
有关详细信息,请参阅此答案:https://stackoverflow.com/a/11617459/1709981