我想知道在静态成员变量中初始化行内的区别是什么,例如:
class Foo
{
private static Bar bar_ = new Bar();
}
或者在静态构造函数中初始化,例如:
class Foo
{
static Foo()
{
bar_ = new Bar();
}
private static Bar bar_;
}
我想知道在静态成员变量中初始化行内的区别是什么,例如:
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区答案:在内联初始化程序和构造函数赋值之间存在执行顺序的差异...当您混合实例和静态成员以及继承时。
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();
产出 (Chǎn chū)
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