像这样初始化的字段的初始化在编译时移动到构造函数的顶部。
class Class1
{
String foo = "bar";
String bar;
public Class1()
{
bar = "baz";
}
}
变成
.class private auto ansi beforefieldinit FieldInitialization.Class1
extends [mscorlib]System.Object
{
.field private string bar
.field private string foo
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
IL_0000: ldarg.0
IL_0001: ldstr "bar"
IL_0006: stfld string FieldInitialization.Class1::foo
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: nop
IL_0012: nop
IL_0013: ldarg.0
IL_0014: ldstr "baz"
IL_0019: stfld string FieldInitialization.Class1::bar
IL_001e: nop
IL_001f: ret
}
}
因此,您选择在哪里初始化它们实际上是一个风格问题。但是,当您要初始化的对象依赖于其他非静态字段、方法或属性时,您必须在构造函数中初始化它们。否则你会得到编译错误:
字段初始值设定项不能引用非静态字段、方法或属性
对于像 StreamWriter(或 Bitmap)这样的 IDispisable 资源,您应该牢记其他人指出的问题。