ですから、リフレクションを学びながらリフレクションを学んでいる間に私は奇妙な問題に遭遇しました。以下のように見 私は、プライベート、読み取り専用フィールドを変更しようとしています:リフレクションで読み取り専用フィールドを変更できません
public class A
{
private static readonly int x;
public int X
{
get { return x; }
}
}
static void Main(string[] args)
{
A obj = new A();
Type objType = typeof(A);
Console.WriteLine(obj.X);
FieldInfo objField = objType.GetField("x", BindingFlags.Static | BindingFlags.NonPublic);
objField.SetValue(null, 100);
Console.WriteLine(obj.X);
Console.ReadLine();
}
それは上記立つように私はプログラムを実行する場合は、0がそれぞれの時間をコンソールに出力されます。 しかし、私が最初のプリントをコメントアウトすると、2番目のプリントは期待される100を書き出します。
ここで何が起こっているのか光を当てることができる人は誰ですか?ありがとう!
EDIT:StranglyそれはVisual Studio 2012では動作するようですが、2010では動作していないようです。私が見た限り、設定は両方で同じです。
編集2:x86ではなくプラットフォームターゲットx64でビルドするときに機能します。新しい質問があると推測する:それはなぜですか?
EDIT 3:逆アセンブリ時のx64およびx86バージョンと比較します。 x86版ではいくつかのインライン展開が行われているようです。
EDIT 4:Okey、think私は何が起きているのか分かりました。私は、インライン化されているクラスAのプロパティが問題だとは思わない。私は、メインメソッドで2回目のプロパティを読み込むときに、プロパティ呼び出しを最適化して(バッキングフィールドは読み取り専用で、値は同じでなければならない)、古い値が再利用されると信じています。それは少なくとも私の「理論」です。
これは、最初に印刷するときにデフォルト値の0を割り当て、それ以降は常に0にするので、最初にコメントアウトすると値100が割り当てられ、その値が印刷されます。 – terrybozzio
* Marc Gravelの呼び出し、Marc Gravelの呼び出し* – Will
フィールドは 'readonly'とマークされているので、JITは' X'ゲッターをインライン展開している可能性があります。 – Romoku