CIL(MSIL)のオブジェクトプロパティにどのようにアクセスしますか?

StackOverflow https://stackoverflow.com/questions/462746

  •  19-08-2019
  •  | 
  •  

質問

私は絶対的な初心者です。スタック上に文字列オブジェクトがあり、その中の文字数-その.Lengthプロパティを取得したいとします。どのようにしてint32番号を内部に隠しますか?

事前に感謝します!

役に立ちましたか?

解決

ILにはプロパティのようなものは実際にはありません。フィールドとメソッドのみがあります。 C#プロパティ構造は、コンパイラによってget_PropertyNameおよびset_PropertyNameメソッドに変換されるため、これらのメソッドを呼び出してプロパティにアクセスする必要があります。

コードのサンプル(デバッグ)IL

var s = "hello world";
var i = s.Length;

IL

  .locals init ([0] string s,
           [1] int32 i)
  IL_0000:  nop
  IL_0001:  ldstr      "hello world"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  callvirt   instance int32 [mscorlib]System.String::get_Length()
  IL_000d:  stloc.1

ご覧のとおり、Lengthプロパティはget_Lengthへの呼び出しを介してアクセスされます。

他のヒント

私はごまかしました...次のC#コードを取得し、ildasm / Reflectorで調べました

static void Main(string[] args)
{
    string h = "hello world";
    int i = h.Length;
}

と同等です
.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string h,
        [1] int32 i)
    L_0000: nop 
    L_0001: ldstr "hello world"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
    L_000d: stloc.1 
    L_000e: ret 
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top