2016-12-02 27 views
2

我在Java中发现了一些相关的问题,但没有发现任何C#,所以请原谅任何重复。初始化默认构造函数或内联变量之间有区别吗?

短而甜,最新的区别?有没有?

public static class Foo 
{ 
    public static List<Bar> Bars; 

    static Foo() 
    { 
     Bars = new List<Bar>(); 
    } 
} 

public static class Foo 
{ 
    public static List<Bar> Bars = new List<Bar>(); 
} 

请参阅@Nick G对非静态类的回答。我仍然想知道它是否对静态类有不同的影响。

现在他们不一定是静态的。这个案子呢?

public class Foo 
{ 
    public List<Bar> Bars; 

    public Foo() 
    { 
     Bars = new List<Bar>(); 
    } 
} 

public class Foo 
{ 
    public List<Bar> Bars = new List<Bar>(); 
} 

+0

根据[this](http://jonskeet.uk/csharp/constructors.html),区别在于实例初始化器先运行,然后构造函数运行。文档[静态字段初始化](https://msdn.microsoft.com/en-us/library/aa645758(v = vs.71).aspx)和[实例字段初始化](https://msdn.microsoft .com/en-us/library/aa645759(v = vs.71).aspx)都表示字段在构造函数之前被初始化。另请阅读[这里](https://blogs.msdn.microsoft.com/ericlippert/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one/ )为继承信息。 – Quantic

+2

我不认为这完全回答你的静态问题,但可能有所帮助:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx –

+1

检查此[文章](http://csharpindepth.com/Articles/General /Beforefieldinit.aspx)对静态构造函数的存在有一点意义。 – Rafal

回答

1

没有,没有,

按照IL,静态内联初始化使用构造,看看发生了什么:

1)静态连续初始化:

static class SomeClass 
{ 
    public static string strField = "Some String"; 

    static SomeClass() 
    { 

    } 
} 

IL

.method private hidebysig specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: ldstr  "Some String" 
    IL_0005: stsfld  string forStackoverflow.SomeClass::strField 
    IL_000a: nop 
    IL_000b: ret 
} // end of method SomeClass::.cctor 

2)构造:

static class SomeClass 
{ 
    public static string strField; 

    static SomeClass() 
    { 
     strField = "Some String"; 
    } 
} 

IL

.method private hidebysig specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "Some String" 
    IL_0006: stsfld  string forStackoverflow.SomeClass::strField 
    IL_000b: ret 
} // end of method SomeClass::.cctor 

所以,从编译器视图视线,没有,有没有不同。

+2

静态构造函数在这里有问题 – Rafal

+0

@Rafal:好的,我改变了测试并更新了答案 –

+0

并且你不正确,请阅读Jon Skeet的文章。 – Rafal

相关问题