C# 在默认构造函数中初始化变量与在内联中初始化变量有区别吗?
我在Java中发现了一些相关的问题,但在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
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的文章。