我想知道在静态构造函数而不是公共构造函数上初始化数据是否存在缺陷。我假设前两个代码狙击手做同样的事情。
下面的简短例子
class Test
{
private readonly static Dictionary<string, string> languages =
new Dictionary<string,string>()
{
{"de-CH", "Language.German".Translate()},
{"fr-CH", "Language.French".Translate()},
{"it-CH", "Language.Italian".Translate()}
};
}
或
class Test
{
private readonly static Dictionary<string, string> languages =
new Dictionary<string,string>();
static LanguageChangeFragment()
{
languages.Add("de-CH", "Language.German".Translate());
languages.Add("fr-CH", "Language.French".Translate());
languages.Add("it-CH", "Language.Italian".Translate());
}
}
或使用公共构造函数
class Test
{
private readonly Dictionary<string, string> languages =
new Dictionary<string,string>();
public LanguageChangeFragment()
{
languages.Add("de-CH", "Language.German".Translate());
languages.Add("fr-CH", "Language.French".Translate());
languages.Add("it-CH", "Language.Italian".Translate());
}
}
编辑:
在最后一个修剪器中更改了已删除的静态,因此在创建新的测试时刻时不会抛出任何异常
答案 0 :(得分:1)
使用公共构造函数的主要问题是每次创建类Test
的对象时都会执行普通的公共构造函数。每次创建languages
实例时,这都会导致静态Test
字典增长。但是,在此示例中,Test
的第二个实例将抛出ArgumentException
,因为字典要求所有键都是唯一的。
对于使用静态构造函数初始化的选项或者声明静态成员的选项,编译后的代码非常相似,因为第一次声明类型为Test
的变量时,此代码将运行并填写你的字典。
请记住,静态构造函数将在初始化所有静态成员后运行。
修改强>
更新了问题,使字典在最后一个示例中成为实例成员。
现在这些例子之间的主要区别在于记忆和适应性的使用。如果存在作为Test
的每个实例的成员的字典实例,则大量实例将使用更多内存。这可能是这里所需要的,特别是如果Test
的实例可能需要调整字典的内容,但不影响其他实例。如果字典在Test
的所有实例中始终包含相同的元素,那么将字典设置为静态是有意义的 - 并且让所有实例在内存中共享相同的字典。
答案 1 :(得分:0)
我认为首先你要了解每个人的特征。
静态构造函数具有以下属性:
因此,只要考虑上述情况,就可以问自己很多问题,例如: