繁体   English   中英

通过静态或公共构造函数进行数据初始化

[英]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所有实例中始终包含相同的元素,则将字典设为静态是有意义的,并让所有实例在内存中共享同一字典。

我认为首先您必须了解每个特征。

从MSDN:

静态构造函数具有以下属性:

  • 静态构造函数不使用访问修饰符或具有参数。
  • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
  • 静态构造函数不能直接调用。 用户无法控制何时在程序中执行静态构造函数。
  • 静态构造函数的典型用法是当类使用日志文件并且构造函数用于将条目写入此文件时。
  • 在为非托管代码创建包装器类时,当构造函数可以调用LoadLibrary方法时,静态构造函数也很有用。

因此,仅考虑上述内容,就问自己很多问题,例如:

  • 初始化此构造函数是否昂贵? 如果是这样,也许我需要控制它的初始化时间,而我将无法使用静态构造函数进行初始化。
  • 我是否需要通过多个线程访问该对象? 如果是这样,我会在使用普通的公共构造函数时遇到麻烦。 与非托管代码相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM