Foreach 循环
foreach 将迭代实现 IEnumerable
的类的任何对象(请注意 IEnumerable<T>
继承自它)。这些对象包括一些内置的,但不限于:List<T>
,T[]
(任何类型的数组),Dictionary<TKey, TSource>
,以及 IQueryable
和 ICollection
等接口。
句法
foreach(ItemType itemVariable in enumerableObject)
statement;
备注
ItemType
类型不需要匹配项目的精确类型,只需要根据项目类型进行分配- 除了
ItemType
之外,还可以使用var
,它将通过检查IEnumerable
实现的泛型参数来推断 enumerableObject 中的项类型 - 该语句可以是块,单个语句甚至是空语句(
;
) - 如果
enumerableObject
没有实现IEnumerable
,代码将无法编译 - 在每次迭代期间,当前项目被强制转换为
ItemType
(即使未指定,但是通过var
进行编译推断),如果项目无法投射,则将抛出InvalidCastException
。
考虑这个例子:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
foreach(var name in list)
{
Console.WriteLine("Hello " + name);
}
相当于:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
IEnumerator enumerator;
try
{
enumerator = list.GetEnumerator();
while(enumerator.MoveNext())
{
string name = (string)enumerator.Current;
Console.WriteLine("Hello " + name);
}
}
finally
{
if (enumerator != null)
enumerator.Dispose();
}