このように初期化するフィールドの初期化は、コンパイル時にコンストラクターの先頭に移動されます。
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(またはビットマップなど)のようなIDispisableリソースの場合、他の人が指摘した問題に留意する必要があります。