foreach (string var in students.Keys)
{
Console.WriteLine(var);
}
var具体是什么参数,
如果仅是一个形参那么为什么会不允许修改
他到底是怎样从集合中取数据的
又是否copy了副本
foreach (object var in students.Keys)
{
Console.WriteLine(var);
}
{
Console.WriteLine(var);
}
var具体是什么参数,
如果仅是一个形参那么为什么会不允许修改
他到底是怎样从集合中取数据的
又是否copy了副本
foreach (object var in students.Keys)
{
Console.WriteLine(var);
}
{
对每一个人进行操作
}明白吗? 这属于迭代
--------
不允许修改枚举项是foreach的特性,与var无关...var是推断类型...由编译器根据初始化语句右侧的表达式推断变量的类型...var关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。它只是表示由编译器确定和分配最适当的类型...
When should I use IEnumerator for looping in c#?
http://stackoverflow.com/questions/456433/when-should-i-use-ienumerator-for-looping-in-c
// 有个回答
According to the C# language spec: A foreach statement of the formforeach (V v in x) embedded-statement is then expanded to:{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
... // Dispose e
}
}The essense of your two examples are the same, but there are some important differences, most notably the try/finally.
public interface IEnumerable{ IEnumerator GetEnumerator();}
public interface IEnumerator
{ bool MoveNext(); void Reset();
Object Current { get; }}在方法中用yield return就可以实现这个直定义的迭带器.
(平常的用法)class 小方 {
static void Main(string[] args)
{
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{
System.Console.WriteLine(i);
}
}
}
输出
0
1
2
3
5
8
13
假设有下面的foreach循环:
foreach(Person p in Persons)
{
Console.Write(p);
}
foreach语句会解析为下面的代码段。首先,调用GetEnumerator()方法,获得数组的一个枚举。然后再使用while循环:
IEnumerator enumerator = persons.GetEnumerator();
while(enumerator.MoveNext())
{
Person p = (Person)enumerator.Current;
Console.Write(p);
}
所以foreach (string var in students.Keys) 中var的数据类型必需和students.Keys的数据类型一致,因为我们看到上面解析的中间代码里是采用强制转换将枚举对像值转换为你定义的对像,如果你声明的对像不一致就会报错了。