初始化默认构造函数中的变量或内联之间有区别吗?

时间:2016-12-02 19:18:46

标签: c#

我在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>();
}

<击>

1 个答案:

答案 0 :(得分: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

所以,从编译器view-sight,不,没有区别。