这问题真纠结……

xyz13171317 2010-09-19 04:14:32
private void main()
{
int[] a = new int[3]{1,2,3};
foreach(int i in a)
{
Console.WriteLine(i);
a = null;
}
}

为什么还能打印出来:1,2,3?
...全文
228 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
RHINO_WU 2010-09-19
  • 打赏
  • 举报
回复
foreach循环里变量修改的时候会报错,但如果你整体对集合赋值的话是没有任何变化,因为foreach里的集合已经是拷贝了。
sgheyulong 2010-09-19
  • 打赏
  • 举报
回复
估计就老师提出的测试吧 。。。
学习了!
Nick黄 2010-09-19
  • 打赏
  • 举报
回复
大家都说了,foreach只能遍历集合中的元素,不能修改集合

想半天,没想出来你做这个是什么需求下的
huangmin3956 2010-09-19
  • 打赏
  • 举报
回复

wq326431904 2010-09-19
  • 打赏
  • 举报
回复
学习了
苏州牛恋歌 2010-09-19
  • 打赏
  • 举报
回复
a=null 你相当与再定义了一个指向那个数组的变量 这时相当于同时有两个a都指向数组地址 而Foreach第一次加载就使用了第一个a,就好比两个大小齿轮你已经把皮带装好了 它都在运行了 你只有把机器停了 (也就是在循环外面把a清空了),你又NEW一个一模一样的再套上去 。。不是白套嘛
HolyPlace 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xyz13171317 的回复:]
int[] a = new int[3]{1,2,3};
foreach(int i in a)
{
Console.WriteLine(i);
a[2] = 5;
}

输出的就是:1,2,5
如果是遍历副本的话,应该输出的是:1,2,3
怎么解释?
[/Quote]
这个的区别应该是a为数组是引用类型,a[2]为整形是值类型
xyz13171317 2010-09-19
  • 打赏
  • 举报
回复
int[] a = new int[3]{1,2,3};
foreach(int i in a)
{
Console.WriteLine(i);
a[2] = 5;
}

输出的就是:1,2,5
如果是遍历副本的话,应该输出的是:1,2,3
怎么解释?
HolyPlace 2010-09-19
  • 打赏
  • 举报
回复
在foreach循环中,迭代集合collectionObject的过程如下:
(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得。但这是可选的。
(2)调用返回的IEnumerator接口的MoveNext()方法。
(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
(4)重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。



在他开始执行的时候就保存一个副本,以后就在这个副本中遍历了。


替代foreach实现:
foreach (XXX a in b){
...
}

等同于

XXX a;
IEnumerator ie = (IEnumable)b.GetEnumerator();
while (ie.MoveNext) {
a = (XXX)ie.Current;
...
}

看这就知道了
Lemon2050 2010-09-19
  • 打赏
  • 举报
回复
很简单,foreach只在循环开始时读了数组a的值,之后的循环都不再读a了。可以添加Console.WriteLine(a[0])进行测试,结果表明此时a已经被设定为NULL。具体你也可以用F11进行调试 ,这样可以很清楚的查看值的变化:

int[] a = new int[3] { 1, 2, 3 };
foreach (int i in a)
{
Console.WriteLine(i);
a = null;
Console.WriteLine(a[0]); //出错
}
foreach (int i in a)//出错
{
Console.WriteLine(i);
a = null;
}
叫我三三 2010-09-19
  • 打赏
  • 举报
回复
哦 没说清楚,foreach 应该是先把数据加载后,再在加载的数据中进行循环。
虽然 a=null了,但是foreach加载的还是以前的那个.
叫我三三 2010-09-19
  • 打赏
  • 举报
回复
foreach 我记得只能读,不能写
justsoso66 2010-09-19
  • 打赏
  • 举报
回复
private void main()
{
int[] a = new int[3]{1,2,3};
for(int i=0;i<a.Length;i++)
{
if(a!=null)
{
Console.WriteLine(a[i]);
}
a = null;
}
}
steven_huangyaoshi 2010-09-19
  • 打赏
  • 举报
回复
借助foreach,只能一一取得数组中的元素,并不能利用这种语句改变数组所存储的元素
我帮你单步跟踪了下 A后面是NULL了
justsoso66 2010-09-19
  • 打赏
  • 举报
回复
在foreach语句里面不要改变集合的值,很容易引发异常,如果需要改变集合请用for循环
private void main()
{
int[] a = new int[3]{1,2,3};
for(int i=0;i<a.Length;i++)
{
Console.WriteLine(a[i]);
a = null;
}
}
steven_huangyaoshi 2010-09-19
  • 打赏
  • 举报
回复
虽然后面A是NULL了 但是FOREACH已经有赋值了 不影响I的输出
个人见解
ccitzs 2010-09-19
  • 打赏
  • 举报
回复
你去问foreach
linwanhai 2010-09-19
  • 打赏
  • 举报
回复
foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用,所以你这种情况不能用foreach

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧