泛型的Foreach方法与foreach语句的区别?
List<Person> lst=new List<Person>();
lst.ForEach(delegate(Person p)
{
p = null;//不会报错,但不会改变对象的值
p = new item();//不会报错,但不会改变对象的值
});
lst.ForEach(p => p = new item());//不会报错,但不会改变对象的值
-------------------------------------------------------------------------------------------------------------
foreach (Person p in lst)
{
p = null;//编译不能通过,迭代变量,无法为它赋值
}
为什么,泛型的Foreach方法可以直接给p赋值,但不报错呢?
这个.ForEach的效果等价于:
List<Person> lst=new List<Person>();
lst.ForEach(delegate(Person p)
{
p = null;//不会报错,但不会改变对象的值
p = new item();//不会报错,但不会改变对象的值
});
lst.ForEach(p => p = new item());//不会报错,但不会改变对象的值
-------------------------------------------------------------------------------------------------------------
foreach (Person p in lst)
{
p = null;//编译不能通过,迭代变量,无法为它赋值
}
为什么,泛型的Foreach方法可以直接给p赋值,但不报错呢?
这个.ForEach的效果等价于:
-
C# code
-
Action < Person > act = p => p = new item(); foreach (Person p in lst) { act(p); }
这里传递给方法的是p的副本(对于引用类型,是其引用地址的副本),所以对其赋值不影响原值。
至于foreach块内不能给p赋值,参照foreach的运行原理(IEnumerable接口)
http://www.cnblogs.com/xiaopin/archive/2011/01/08/1930535.html
http://topic.youkuaiyun.com/u/20110702/23/ab1ddfaf-0576-409f-aed5-b24ab10046e6.html