IEnumerator means enumerator, IEnumerable means enumerable. Both are interfaces
foreach is a syntactic sugar used to simplify code iterating over enumerable elements. The traversed class implements the traversal function by implementing the IEnumerable interface and a related IEnumerator enumerator.
public class MyList : IEnumerable
{
public int[] _data = new int[10] { 1, 5, 7, 9, 7, 8, 7, 8, 7, 4 };
public int this[int index]
{
get
{
return _data[index];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
Debug.Log("foreach调用 GetEnumerator");
return new MIEnumtor(this);
}
}
public class MIEnumtor : IEnumerator
{
private MyList myList;
private int index;
public MIEnumtor(MyList my)
{
index = -1;
myList = my;
}
public object Current
{
get
{
Debug.Log("foreach调用 Current");
return myList[index];
}
}
public bool MoveNext()
{
Debug.Log("foreach调用 MoveNext");
if (index < myList._data.Length - 1)
{
index++;
return true;
}
index = -1;
return false;
}
public void Reset()
{
}
}
GetIEnumerator() is responsible for getting the enumerator.
MoveNext() is responsible for letting Current get the next value and judging whether the traversal is over.
Current is responsible for returning the value currently pointed to.
Rest() is responsible for resetting the state of the enumerator (not used in foreach).
These are IEnumerable, the basic working principle of IEnumerator.
MyList my = new MyList();
foreach (var item in my)
{
Debug.Log(item);
}
Equivalent to
MyList my = new MyList();
MIEnumtor mIEnumtor = my.GetEnumerator();
while (mIEnumtor.MoveNext())
{
Debug.Log(mIEnumtor.Current);
}