Я просто просматривал декомпилированный код для System.Collections.Generic.List(Of T).Add(item As T)
с помощью ILSpy и нашел вызов __PostIncrement
. Я никогда не слышал о такой вещи в VB, поэтому я немного покопался и нашел:
- В VB код
Me._items(__PostIncrement(Me._size)) = item
. - В C# код
this._items[this._size++] = item;
использует фактический оператор постинкремента на этом языке. - В 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
? Является ли изобретение SharpDevelop символом постинкрементного IL-кода в VB? Или это какое-то определение, которое я мог бы использовать в своем собственном коде VB?