在C#中初始化静态变量内联或静态构造函数的差异

我想知道初始化内联静态成员有什么区别,如:

class Foo { private static Bar bar_ = new Bar(); } 

或者在静态构造函数中初始化它,如:

 class Foo { static Foo() { bar_ = new Bar(); } private static Bar bar_; } 

如果类型中有静态构造函数,则由于不再应用beforefieldinit标志而导致类型初始化。

它还影响初始化顺序 – 变量初始化程序都在静态构造函数之前执行。

据我所知,这就是它。

在这种情况下,我不相信有任何实际差异。 如果在初始化静态变量时需要一些逻辑 – 比如如果你想在给定不同条件的情况下使用不同具体类型的接口 – 那么你将使用静态构造函数。 另外,内联初始化在我的书中很好。

 class Foo { private static IBar _bar; static Foo() { if(something) { _bar = new BarA(); } else { _bar = new BarB(); } } } 

Twilight zone回答:内联初始化器和ctor分配之间的执行顺序有所不同……当你在实例和静态成员以及inheritance中混合启动时。

 For static members, static initializers Static ctors (execute bottom up) Base static initializer Base static ctor and so on For instance members, initializers in current class execute first Then initializers in base class execute ( up the chain) Then top-most base ctor is executed (and we walk down now. Instance ctors execute top-down) Finally current type's ctor is executed. 

示例:)

 public class CBase { static Talkative m_Baseob1 = new Talkative("Base Static Initializer-"); static Talkative m_Baseob2; Talkative m_Baseob3 = new Talkative("Base Inst Initializer"); Talkative m_Baseob4; static CBase() { Console.WriteLine("***MethodBegin: Static Base Ctor"); m_Baseob2 = new Talkative("Base Static Ctor"); Console.WriteLine("***MethodEnd: Static Base Ctor"); } public CBase() { Console.WriteLine("***MethodBegin: Instance Base Ctor"); m_Baseob4 = new Talkative("Base Instance Ctor"); Console.WriteLine("***MethodEnd: Instance Base Ctor"); } } public class CDerived : CBase { static Talkative m_ob1 = new Talkative("Derived Static Initializer"); static Talkative m_ob2; Talkative m_ob3 = new Talkative("Derived Inst Initializer"); Talkative m_ob4; static CDerived() { Console.WriteLine("***MethodBegin: Derived Static Ctor"); m_ob2 = new Talkative("Derived Static Ctor"); Console.WriteLine("***MethodEnd: Derived Static Ctor"); } public CDerived() { Console.WriteLine("***MethodBegin: Derived Instance Ctor"); m_ob4 = new Talkative("Derived Instance Ctor"); Console.WriteLine("***MethodEnd: Derived Instance Ctor"); } } internal class Talkative { public Talkative(string sID) { Console.WriteLine(sID + " - Talkative created" ); } } # Main function somewhere CDerived s = new CDerived(); 

输出:

 Derived Static Initializer - Talkative created ***MethodBegin: Derived Static Ctor Derived Static Ctor - Talkative created ***MethodEnd: Derived Static Ctor Derived Inst Initializer - Talkative created Base Static Initializer- - Talkative created ***MethodBegin: Static Base Ctor Base Static Ctor - Talkative created ***MethodEnd: Static Base Ctor Base Inst Initializer - Talkative created ***MethodBegin: Instance Base Ctor Base Instance Ctor - Talkative created ***MethodEnd: Instance Base Ctor ***MethodBegin: Derived Instance Ctor Derived Instance Ctor - Talkative created ***MethodEnd: Derived Instance Ctor