社区
C#
帖子详情
这问题真纠结……
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
打赏
收藏
这问题真纠结……
private void main() { int[] a = new int[3]{1,2,3}; foreach(int i in a) { Console.WriteLine(i); a = null; } } 为什么还能打印出来:1,2,3?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
J001简简单单留言本 v0.0.4.rar
这个版本
真
的很
纠结
……说是将原版本J001_0.0.3bd1修改为面向对象的方式运行,但是mysql_operathing.php中一些操作似乎又违背了面向对象的思想。 作为一个测试版本吧!功能和J001_0.0.3bd1相同只是将很多文件和功能...
安卓蓝牙打印
理论上已经实现了,我这连蓝牙打印机连不上去,如果你能连上,给说下,我好确定不是个人的原因,而是公司打印机的
问题
。
纠结
啊……
winform记住密码
winform记住密码,当时不会……
纠结
的……现在把东西传上来,希望对大家有帮助吧
J001简简单单留言本 v0.0.4
这个版本
真
的很
纠结
……说是将原版本J001_0.0.3bd1修改为面向对象的方式运行,但是mysql_operathing.php中一些操作似乎又违背了面向对象的思想。 作为一个测试版本吧!功能和J001_0.0.3bd1相同只是将很多文件和功能...
H-Siren:WordPress单栏主题,支持分成PJAX,自适应手机端
(当然是根据自己喜欢的口味来更改滴啦)学长是个细节控,代码洁癖,某些强迫症集一身的人啦…… (才不是处女座呢,学长是风象天秤座的)所以在打磨这款主题在细节处
纠结
了N多遍后才能有决定的说…… 嗯,好作品...
C#
110,549
社区成员
642,562
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章