摘自《c#语言规范》:
for语句计算一个初始化表达式序列(括号第一条),然后,当某个条件(括号第二条)为真时,重复执行相关的嵌入语句(大括号内)并计算一个迭代表达式序列(括号第三条)。
foreach语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次相关的嵌入语句。迭代变量相当于一个其范围覆盖整个嵌入语句的只读局部变量。在foreach语句执行期间,迭代变量表示当前正在为其执行迭代的集合元素。如果嵌入语句试图修改迭代变量(通过赋值或++和‑‑运算符)或将迭代变量作为ref或out参数传递,则将发生编译时错误。
简单地说:
for语句是根据你给定的条件,完成各种迭代(循环)操作,而foreach是直接遍历集合(数组等)内的每个元素,且当前遍历到的元素为只读,无法进行赋值等操作。