2

このクラスを検討してください。

public class Foo
{
    // Fields
    private string _bar;

    // Properties
    private string Bar
    {
        get
        {
            return this._bar;
        }
        set
        {
            this._bar = value;
        }
    }
}

ここで、コンパイラーによって出力されたILコードを調べて、Barプロパティのセッターを探します。

.method private hidebysig specialname instance void set_Bar(string 'value') cil managed
{
    .maxstack 8
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldarg.1 
    L_0003: stfld string ConsoleApplication2.Program/Foo::_bar
    L_0008: ret 
}

なぜそれをするのldarg.0ですか?最初の(インデックス0)引数には何がありますか?メソッド/プロパティセッターは1つの引数しかとらないので...

同じことがゲッターにも当てはまります。

.method private hidebysig specialname instance string get_Bar() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldfld string ConsoleApplication2.Program/Foo::_bar
    L_0007: stloc.0 
    L_0008: br.s L_000a
    L_000a: ldloc.0 
    L_000b: ret 
}

なぜ.locals init?なぜldarg.0?なぜそれはldfldバッキングフィールドのを行い、それを返すだけではないのですか?:)

4

1 に答える 1

4

セッターの場合:

すべてのインスタンスメンバーには、暗黙の「this」パラメータがあります。これは、基本的にロードされるものです。それを静的プロパティに変えてみてください。そうすれば、それが消えるのがわかります。

ゲッターの場合、なぜローカル変数があるのか​​わかりません...デバッガーのサポートはおそらくありますか?確かに(/o+ /debug-コマンドラインから)最適化モードでコンパイルすると、ローカル変数が削除されます。

于 2010-11-15T13:23:18.367 に答える