yield return Il代码讲解

 

 

.class nested private auto ansi sealed beforefieldinit '<GetEnumerator>d__12'
    extends [System.Runtime]System.Object
    implements class [System.Runtime]System.Collections.Generic.IEnumerator`1<object>,
               [System.Runtime]System.Collections.IEnumerator,
               [System.Runtime]System.IDisposable

//这个位置相当于以上等于 private class  sealed <GetEnumerator>d__12:object,IEnumerator,IEnumerator,IDisposable
// nested :嵌套    
//implements  :实现接口
//extends:是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,
{ .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Fields 字段 .field private int32 '<>1__state' .field private object '<>2__current' .field public class School.ClassOfStudent '<>4__this' .field private int32 '<index>5__1' // Methods
//
.method public hidebysig specialname rtspecialname instance void .ctor ( int32 '<>1__state' ) cil managed
//cil managed:托管代码 { .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) // Method begins at RVA 0x2369 // Code size 15 (0xf) .maxstack 8 // { IL_0000: ldarg.0 // (no C# code) IL_0001: call instance void [System.Runtime]System.Object::.ctor() // this.<>1__state = <>1__state; IL_0006: nop IL_0007: ldarg.0 IL_0008: ldarg.1 IL_0009: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<>1__state' // } IL_000e: ret } // end of method '<GetEnumerator>d__12'::.ctor .method private final hidebysig newslot virtual instance void System.IDisposable.Dispose () cil managed { .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) .override method instance void [System.Runtime]System.IDisposable::Dispose() // Method begins at RVA 0x2379 // Code size 1 (0x1) .maxstack 8 // } IL_0000: ret } // end of method '<GetEnumerator>d__12'::System.IDisposable.Dispose .method private final hidebysig newslot virtual instance bool MoveNext () cil managed { .override method instance bool [System.Runtime]System.Collections.IEnumerator::MoveNext() // Method begins at RVA 0x237c // Code size 133 (0x85) .maxstack 3 .locals init ( [0] int32, [1] int32, [2] bool ) // switch (<>1__state) IL_0000: ldarg.0 IL_0001: ldfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<>1__state' IL_0006: stloc.0 // (no C# code) IL_0007: ldloc.0 IL_0008: brfalse.s IL_0012 IL_000a: br.s IL_000c IL_000c: ldloc.0 IL_000d: ldc.i4.1 IL_000e: beq.s IL_0014 IL_0010: br.s IL_0016 IL_0012: br.s IL_0018 // return false; IL_0014: br.s IL_004f IL_0016: ldc.i4.0 IL_0017: ret // <>1__state = -1; IL_0018: ldarg.0 IL_0019: ldc.i4.m1 IL_001a: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<>1__state' // <index>5__1 = 0; IL_001f: nop IL_0020: ldarg.0 IL_0021: ldc.i4.0 IL_0022: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<index>5__1' // break; IL_0027: br.s IL_0067 // <>2__current = <>4__this.students[<index>5__1]; IL_0029: nop IL_002a: ldarg.0 IL_002b: ldarg.0 IL_002c: ldfld class School.ClassOfStudent School.ClassOfStudent/'<GetEnumerator>d__12'::'<>4__this' IL_0031: ldfld class [System.Collections]System.Collections.Generic.List`1<class School.Student> School.ClassOfStudent::students IL_0036: ldarg.0 IL_0037: ldfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<index>5__1' IL_003c: callvirt instance !0 class [System.Collections]System.Collections.Generic.List`1<class School.Student>::get_Item(int32) IL_0041: stfld object School.ClassOfStudent/'<GetEnumerator>d__12'::'<>2__current' // <>1__state = 1; IL_0046: ldarg.0 IL_0047: ldc.i4.1 IL_0048: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<>1__state' // return true; IL_004d: ldc.i4.1 IL_004e: ret // <>1__state = -1; IL_004f: ldarg.0 IL_0050: ldc.i4.m1 IL_0051: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<>1__state' // <index>5__1++; IL_0056: nop IL_0057: ldarg.0 IL_0058: ldfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<index>5__1' IL_005d: stloc.1 // if (<index>5__1 < <>4__this.students.Count) IL_005e: ldarg.0 IL_005f: ldloc.1 IL_0060: ldc.i4.1 IL_0061: add IL_0062: stfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<index>5__1' IL_0067: ldarg.0 IL_0068: ldfld int32 School.ClassOfStudent/'<GetEnumerator>d__12'::'<index>5__1' IL_006d: ldarg.0 IL_006e: ldfld class School.ClassOfStudent School.ClassOfStudent/'<GetEnumerator>d__12'::'<>4__this' IL_0073: ldfld class [System.Collections]System.Collections.Generic.List`1<class School.Student> School.ClassOfStudent::students IL_0078: callvirt instance int32 class [System.Collections]System.Collections.Generic.List`1<class School.Student>::get_Count() IL_007d: clt IL_007f: stloc.2 IL_0080: ldloc.2 IL_0081: brtrue.s IL_0029 // return false; IL_0083: ldc.i4.0 IL_0084: ret } // end of method '<GetEnumerator>d__12'::MoveNext .method private final hidebysig specialname newslot virtual instance object 'System.Collections.Generic.IEnumerator<System.Object>.get_Current' () cil managed { .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) .override method instance !0 class [System.Runtime]System.Collections.Generic.IEnumerator`1<object>::get_Current() // Method begins at RVA 0x240d // Code size 7 (0x7) .maxstack 8 // return <>2__current; IL_0000: ldarg.0 IL_0001: ldfld object School.ClassOfStudent/'<GetEnumerator>d__12'::'<>2__current' IL_0006: ret } // end of method '<GetEnumerator>d__12'::'System.Collections.Generic.IEnumerator<System.Object>.get_Current' .method private final hidebysig newslot virtual instance void System.Collections.IEnumerator.Reset () cil managed { .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) .override method instance void [System.Runtime]System.Collections.IEnumerator::Reset() // Method begins at RVA 0x2415 // Code size 6 (0x6) .maxstack 8 // throw new NotSupportedException(); IL_0000: newobj instance void [System.Runtime]System.NotSupportedException::.ctor() IL_0005: throw } // end of method '<GetEnumerator>d__12'::System.Collections.IEnumerator.Reset .method private final hidebysig specialname newslot virtual instance object System.Collections.IEnumerator.get_Current () cil managed { .custom instance void [System.Runtime]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) .override method instance object [System.Runtime]System.Collections.IEnumerator::get_Current() // Method begins at RVA 0x241c // Code size 7 (0x7) .maxstack 8 // return <>2__current; IL_0000: ldarg.0 IL_0001: ldfld object School.ClassOfStudent/'<GetEnumerator>d__12'::'<>2__current' IL_0006: ret } // end of method '<GetEnumerator>d__12'::System.Collections.IEnumerator.get_Current // Properties .property instance object 'System.Collections.Generic.IEnumerator<System.Object>.Current'() { .get instance object School.ClassOfStudent/'<GetEnumerator>d__12'::'System.Collections.Generic.IEnumerator<System.Object>.get_Current'() } .property instance object System.Collections.IEnumerator.Current() { .get instance object School.ClassOfStudent/'<GetEnumerator>d__12'::System.Collections.IEnumerator.get_Current() } } // end of class <GetEnumerator>d__12

 

上一篇:反反编译的手段


下一篇:【Paper】2018_Nonlinear Consensus-Based Connected Vehicle Platoon Control Incorporating Car-Following