[英]Data initialization over static or public constructor
我想知道通过静态构造函数而不是公共构造函数初始化数据是否有缺点。 我假设前两个代码狙击手也是如此。
下面是一个简短的例子
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());
}
}
编辑:
更改了最后一个快照程序中已删除的静态内容,因此在创建新的测试瞬间时不会引发异常
使用公共构造函数的主要问题是,每次创建Test
类的对象时,都会执行常规的公共构造函数。 每次创建Test
实例时,这都会导致静态languages
字典增加。 但是,在此示例中, Test
的第二个实例将引发ArgumentException
因为字典要求所有键都是唯一的。
至于使用静态构造函数初始化或在其中声明静态成员的显示选项,则编译后的代码非常相似,因为首次声明类型为Test
的变量时,此代码将运行并填充您的字典。
请记住,在初始化所有静态成员之后,静态构造函数将运行。
编辑
在上一个示例中,问题已更新为使字典成为实例成员。
现在,这些示例之间的主要区别在于内存的使用和适应性。 如果有一个字典实例是Test
的每个实例的成员,则大量实例将使用更多的内存。 这可能是此处需要的,尤其是在Test
实例可能需要调整字典内容但不影响其他实例的情况下。 如果字典在Test
所有实例中始终包含相同的元素,则将字典设为静态是有意义的,并让所有实例在内存中共享同一字典。
我认为首先您必须了解每个特征。
静态构造函数具有以下属性:
因此,仅考虑上述内容,就问自己很多问题,例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.