3

System.Collections.Generic.List(Of T).Add(item As T)ILSpyを使用するために逆コンパイルされたコードを熟読していたところ、への呼び出しが見つかりました__PostIncrement。私はVBでそのようなことを聞​​いたことがないので、掘り下げて見つけました:

  1. VBでは、コードはMe._items(__PostIncrement(Me._size)) = itemです。
  2. C#では、コードはthis._items[this._size++] = item;その言語で実際のポストインクリメント演算子を使用しています
  3. MSILには、関数呼び出しはありません。これは、C#のポストインクリメントのように機能するようです(コメントは私のものですが、私はMSILの専門家ではないため、間違っている可能性があります)。

コードは次のとおりです。

IL_001e: ldarg.0
IL_001f: ldfld !0[] class System.Collections.Generic.List`1<!T>::_items
IL_0024: ldarg.0
IL_0025: dup
IL_0026: ldfld int32 class System.Collections.Generic.List`1<!T>::_size
IL_002b: dup
IL_002c: stloc.0           // store the size pre incrementing
IL_002d: ldc.i4.1
IL_002e: add               // do the increment
IL_002f: stfld int32 class System.Collections.Generic.List`1<!T>::_size
IL_0034: ldloc.0           // reload the stored size to use as index in stelem
IL_0035: ldarg.1
IL_0036: stelem.any !T

これは正確には何__PostIncrementですか?VBでインクリメント後のILコードをシンボル化するのはSharpDevelopの発明ですか?それとも、実際に自分のVBコードで使用できるある種の定義ですか?

4

1 に答える 1

2

__PostIncrementはC#と同等ですoperator++。これは、数値をインクリメント(1つ追加)する簡単な方法です。残念ながら、 Visual Basicの演算子のリストによると、同等のものはありません。

于 2013-01-01T10:16:29.010 に答える