我真的很惊讶这个问题没有真正的答案。
例如,我有一个foreach循环迭代队列(我正在使用.Net版本)foreach队列中究竟发生了什么?
它是否像标准枚举器一样迭代?或者它是否使用Dequeue()
功能。
为清楚起见:
Queue<int> q = new Queue<int>();
foreach(int i in q)
{
// what happens in this loop?
}
答案 0 :(得分:8)
它是否像标准枚举器一样迭代?或者它是否使用 Dequeue()
它不是迭代队列,而是使用Queue<T>.GetElement
方法在其内部数组中按索引和存储区查找元素。您可以在implementation of the Enumerator
class returned by Queue<T>.GetEnumerator()
:
public bool MoveNext()
{
if (_version != _q._version)
ThrowHelper.ThrowInvalidOperationException(
ExceptionResource.InvalidOperation_EnumFailedVersion);
if (_index == -2)
return false;
_index++;
if (_index == _q._size)
{
_index = -2;
_currentElement = default(T);
return false;
}
_currentElement = _q.GetElement(_index);
return true;
}
GetElement
只是:
internal T GetElement(int i)
{
return _array[(_head + i) % _array.Length];
}
答案 1 :(得分:1)