17,740
社区成员
发帖
与我相关
我的任务
分享
public class MyIEnumberableAndIEnumberatorTest
{
public void DemoStart()
{
Person[] pe = new Person[10];
for (int i = 0; i < pe.Length; i++)
{
pe[i] = new Person(i.ToString(), Convert.ToString(i * i));
}
People po = new People(pe);
string str="";
foreach (Person a in po)
{
str += a.firstName + a.lastName;
Person aa = a;
}
}
public class Person
{
public Person(string fName, string lName)
{
this.firstName = fName;
this.lastName = lName;
}
public string firstName;
public string lastName;
}
public class People : IEnumerable
{
private Person[] _people;
public People(Person[] pArray)
{
_people = new Person[pArray.Length];
for (int i = 0; i < pArray.Length; i++)
{
_people[i] = pArray[i];
}
}
public IEnumerator GetEnumerator()
{
return new PeopleEnum(_people);
}
}
public class PeopleEnum : IEnumerator
{
public Person[] _people;
// Enumerators are positioned before the first element
// until the first MoveNext() call.
int position = -1;
public PeopleEnum(Person[] list)
{
_people = list;
}
public bool MoveNext()
{
position++;
return (position < _people.Length);
}
public void Reset()
{
position = -1;
}
public object Current
{
get
{
try
{
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}
}
.method public hidebysig instance void DemoStart() cil managed
{
// コード サイズ 165 (0xa5)
.maxstack 5
.locals init ([0] class ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person[] pe,
[1] int32 i,
[2] class ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/People po,
[3] string str,
[4] class ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person a,
[5] class ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person aa,
[6] bool CS$4$0000,
[7] class [mscorlib]System.Collections.IEnumerator CS$5$0001,
[8] class [mscorlib]System.IDisposable CS$0$0002)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: newarr ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person
IL_0008: stloc.0
IL_0009: ldc.i4.0
IL_000a: stloc.1
IL_000b: br.s IL_002a
IL_000d: nop
IL_000e: ldloc.0
IL_000f: ldloc.1
IL_0010: ldloca.s i
IL_0012: call instance string [mscorlib]System.Int32::ToString()
IL_0017: ldloc.1
IL_0018: ldloc.1
IL_0019: mul
IL_001a: call string [mscorlib]System.Convert::ToString(int32)
IL_001f: newobj instance void ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person::.ctor(string,
string)
IL_0024: stelem.ref
IL_0025: nop
IL_0026: ldloc.1
IL_0027: ldc.i4.1
IL_0028: add
IL_0029: stloc.1
IL_002a: ldloc.1
IL_002b: ldloc.0
IL_002c: ldlen
IL_002d: conv.i4
IL_002e: clt
IL_0030: stloc.s CS$4$0000
IL_0032: ldloc.s CS$4$0000
IL_0034: brtrue.s IL_000d
IL_0036: ldloc.0
IL_0037: newobj instance void ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/People::.ctor(class ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person[])
IL_003c: stloc.2
IL_003d: ldstr ""
IL_0042: stloc.3
IL_0043: nop
IL_0044: ldloc.2
IL_0045: callvirt instance class [mscorlib]System.Collections.IEnumerator ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/People::GetEnumerator()
IL_004a: stloc.s CS$5$0001
.try
{
IL_004c: br.s IL_0077
IL_004e: ldloc.s CS$5$0001
IL_0050: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
IL_0055: castclass ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person
IL_005a: stloc.s a
IL_005c: nop
IL_005d: ldloc.3
IL_005e: ldloc.s a
IL_0060: ldfld string ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person::firstName
IL_0065: ldloc.s a
IL_0067: ldfld string ConsoleApplication1.MyIEnumberableAndIEnumberatorTest/Person::lastName
IL_006c: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_0071: stloc.3
IL_0072: ldloc.s a
IL_0074: stloc.s aa
IL_0076: nop
IL_0077: ldloc.s CS$5$0001
IL_0079: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
IL_007e: stloc.s CS$4$0000
IL_0080: ldloc.s CS$4$0000
IL_0082: brtrue.s IL_004e
IL_0084: leave.s IL_00a3
} // end .try
finally
{
IL_0086: ldloc.s CS$5$0001
IL_0088: isinst [mscorlib]System.IDisposable
IL_008d: stloc.s CS$0$0002
IL_008f: ldloc.s CS$0$0002
IL_0091: ldnull
IL_0092: ceq
IL_0094: stloc.s CS$4$0000
IL_0096: ldloc.s CS$4$0000
IL_0098: brtrue.s IL_00a2
IL_009a: ldloc.s CS$0$0002
IL_009c: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_00a1: nop
IL_00a2: endfinally
} // end handler
IL_00a3: nop
IL_00a4: ret
} // end of method MyIEnumberableAndIEnumberatorTest::DemoStart
Person[] pe = new Person[10];
.....
foreach (Person a in po)
{
str += a.firstName + a.lastName;
Person aa = a;
}