まず、一般的な注記:ILを分析して得られるように、「価値」について語ります。 this
が含まれていない限り、表現は何でもよいので、これは一般的ではありません。値を計算する命令だけが得られますが、これはアプリケーションにとっては十分かもしれません。これの意味論は予測が、明らかではありません
public int i { get; set; } = s = t = 1;
public static int s { get; set; } = t;
public static int t = 2;
:s
のデフォルト値は0であるエッジケースでは、特に、式はプロパティのバッキングフィールド以外のフィールドを初期化する可能性があるという事実を考えます(初期化が宣言順序で起こるためt
が明示的にこの時点で初期化されていない)、t
のデフォルト値は2であり、そしてi
のデフォルト値は、それが発生した場合、その初期化は、また、t
とを設定ひねりと、1その後、s
1に、この場合のILコードから値を導出することは容易ではありません、とさえ初期化子を識別することは、あなたが考えることを必要とするを/stsfld
命令は、古いフィールドとは対照的に、プロパティのバッキングフィールドに割り当てます。
簡単に言えば、プロパティが型のデフォルト値に初期化されている場合、コンパイラはnewobj
によって処理されるため、プロパティの初期化を完全に省略することがあります。 ILレベルでは、次のように同じコードをもたらし得る:
int a { get; set; } = 3/4;
と
int a { get; set; }
これはコードで初期化どのように見えるかに存在しなくてもよいという意味でのエッジケースでありますILはまったくありません。あなたが興味を持っているのは、明示的なイニシャライザが使われたかどうかではなく、値であるならば、もちろん問題ありません。
私はすでにそれを行っているC#でいくつかのサンプルを書くと、生成されたIL –
をご確認ください。それは私が言及した前提につながります。私は例外がないことを確かめたい。 –