当与数组一起使用时,编译器会将foreach
循环编译为类似于for
循环的内容。当与or一起使用时foreach
,编译器会将循环编译foreach
成类似于循环的东西。那么这是否意味着纯粹?或者它有什么复杂之处?while
foreach
IEnumerable
IEnumerable<T>
foreach
syntactic sugar
CLR 知道foreach
吗?foreach
MSIL 代码中是否有专门设计的内容?
当与数组一起使用时,编译器会将foreach
循环编译为类似于for
循环的内容。当与or一起使用时foreach
,编译器会将循环编译foreach
成类似于循环的东西。那么这是否意味着纯粹?或者它有什么复杂之处?while
foreach
IEnumerable
IEnumerable<T>
foreach
syntactic sugar
CLR 知道foreach
吗?foreach
MSIL 代码中是否有专门设计的内容?
它是纯粹的语法糖,没有它你可以获得相同的行为,是的。许多其他事情都是一样的......for
等等while
......错误地引用阿基米德:“给我if
和goto
,我会移动代码......”
不,CLR 没有任何foreach
.
foreach
在内部只是一个while
调用IEnumerator
.
是的,它纯粹是糖。以下代码
var MyList = new List<int>() { 10 , 20 , 30 , 40, 50} ;
foreach(int i in MyList)
{
Console.WriteLine(i);
}
在编译器中翻译为:
Ienumrator<int> rator = MyList.GetEnumrator();
try
{
while(rator.MoveNext())
{
int i = rator.Current;
Console.WriteLine(i);
}
}
finally
{
rator.Dispose()
}
它不仅仅是语法糖,因为 foreach 循环中的项目是不可变的(不可更改的)。正如 Daniel 亲切地指出的那样,这样做的原因是大多数集合将在 foreach 中使用枚举器,而枚举器的限制是在枚举列表时不允许您更新列表的内容。
IE
Foreach(String s in List<string>)
{
s = "f"; //this will throw an error.
}