C# 在默认构造函数中初始化变量与在内联中初始化变量有区别吗?

C# 在默认构造函数中初始化变量与在内联中初始化变量有区别吗?,c#,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> Ba

我在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>();
}
公共静态类Foo
{
公共静态列表栏;
静态Foo()
{
条=新列表();
}
}
公共静态类Foo
{
公共静态列表栏=新列表();
}
关于非静态类的答案,请参见@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>();
}
公共类Foo
{
公共酒吧名单;
公共食物(
{
条=新列表();
}
}
公开课Foo
{
公共列表栏=新列表();
}
不,没有

根据
IL
,静态内联初始值设定项使用构造函数,请参见发生了什么:

1)静态内联初始值设定项:

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

    static SomeClass()
    {

    }
}
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:  ldstr      "Some String"
  IL_0005:  stsfld     string forStackoverflow.SomeClass::strField
  IL_000a:  nop
  IL_000b:  ret
} // end of method SomeClass::.cctor
.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)构造函数:

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

    static SomeClass()
    {

    }
}
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:  ldstr      "Some String"
  IL_0005:  stsfld     string forStackoverflow.SomeClass::strField
  IL_000a:  nop
  IL_000b:  ret
} // end of method SomeClass::.cctor
.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

因此,从编译器视图来看,没有区别。

根据,区别在于实例初始值设定项先运行,然后构造函数运行。和的文档都表明字段是在构造函数之前初始化的。也请阅读继承信息。我认为这并不能完全回答您的静态问题,但可能会有所帮助:检查一下这一点,静态构造函数的存在并没有什么意义here@Rafal:好的,我更改了测试并更新了答案,但你不正确,请阅读Jon Skeet的文章。