Компилятор встроит инициализатор поля в код для конструктора, так что сначала вызывается и , а затем поле снова инициализируется вызовом в конструкторе.Взгляд на IL для кода делает это очень очевидным.
Например, такой код
class Foo
{
StringBuilder sb = new StringBuilder(1);
public Foo()
{
sb = new StringBuilder(2);
}
}
выглядит так на уровне IL
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldc.i4.1 <-- ARGUMENT = 1
L_0002: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32)
L_0007: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o
L_000c: ldarg.0
L_000d: call instance void [mscorlib]System.Object::.ctor()
L_0012: nop
L_0013: nop
L_0014: ldarg.0
L_0015: ldc.i4.2 <-- ARGUMENT = 2
L_0016: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32)
L_001b: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o
L_0020: nop
L_0021: ret
}