2014-03-26 109 views
1

我想知道是否有一个缺点,通过静态构造函数而不是公共构造函数初始化数据。我认为前两个代码狙击手也是这样做的。静态或公共构造函数的数据初始化

下面

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

是不是您的类名'LanguageChangeFragment'而不是'Test'? – Habib

回答

1

使用公共构造函数的主要问题是每次创建类Test的对象时都会执行普通公共构造函数。每当您创建Test的实例时,这会导致静态的languages字典增大。然而在这个例子中,Test的第二个实例会抛出ArgumentException,因为字典要求所有的键都是唯一的。

对于使用静态构造函数初始化或声明静态成员的选项,编译代码非常相似,因为第一次声明类型为Test的变量时,此代码将运行并填充您的字典。

请记住,静态构造函数将在所有静态成员初始化后运行。

编辑

的问题进行了更新,使词典的实例成员在最后一个例子。

这些例子现在的主要区别在于使用内存和适应性。如果有一个字典实例是Test的每个实例的成员,则大量实例将使用更多内存。这可能是这里所要求的,特别是如果Test的实例可能需要修改字典的内容,但不影响其他实例。如果字典将始终包含Test的所有实例中的相同元素,那么将字典设置为静态是有意义的 - 并让所有实例在内存中共享相同的字典。

+0

字典不允许具有相同密钥的实体。因此,第二个实例构造函数调用抛出异常 –

+0

好点,我会更新我的答案以反映这一点。 – davisoa

+0

Ups我忘了删除最后一个代码块中的静态。是否还有其他缺点,每次对象Test初始化时都会创建Dictionary? – suizo

0

我认为首先你必须了解每个人的特点。

From MSDN:

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

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

所以只是想着上面,问自己很多问题,比如:

  • 是它昂贵初始化此构造?如果是这样,也许我需要控制什么时候它被初始化,我将无法使用静态构造函数。
  • 我是否需要通过多个线程访问此对象?如果是这样,我可以使用普通的公共构造函数让自己陷入麻烦。非托管代码也是如此。
相关问题