关于foreach的疑惑,或许也涉及多态和集合,搞不清楚

装逼之王 2014-08-25 11:23:03


ArrayList里是用object来存储元素的,为啥foreach的时候不用object的变量来接收?

谁要回答的让我明白了,爷重重有赏!

新人求罩,求师傅!
...全文
347 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
装逼之王 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
比如
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

foreach(string s in x)
{
}
编译器展开成等价如下形式的代码:
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

IEnumerator enumerator = (x).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      string element = (string)enumerator.Current; // here is casting occures **************
      // loop body;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}
注意编译器会在***********处增加强制类型转换。 如果ArrayList中的元素不都是string,会报运行时错误。
也就是在foreach里,你声明啥类型变量,编译器会强制转成啥类型吗? 好吧,记下来, 我有个缺点,就是书上没讲到的知识点,我自已遇到的问题,即使后来知道答案了,但是总感觉自己无法理解,只能死记住。 要是书上一开始就说会强制类型转换,我就会很理解的样子,冏。
装逼之王 2014-08-26
  • 打赏
  • 举报
回复
囧,我没事大晚上来故意打扰各位大神作甚?
我叫小菜菜 2014-08-26
  • 打赏
  • 举报
回复
引用 4 楼 qingchuninfo 的回复:
[quote=引用 3 楼 sp1234 的回复:] 从你的标题就能看出,你肯定不是自己想出的这个问题,而是照抄人家文章里的个别字眼儿,然后故意来提问。 建议你提问时列出你之前已经过的参考文章。
冏,我有那么无聊吗? 我看《C井入门经典》第六版239页的代码时碰到的[/quote] 我认为LZ并不是故意来提问的。 或许你听说过“不完全信息静态博弈”这个概念,显然一个人遇到的问题,99.999999%在Internet上面都能找到答案。但为啥还是会有那么多人提问?互联网是一个巨大的信息数据库,但是并不是所有人都完全掌握的。
ArrayList x=new ArrayList(); x.Add(10); x.Add("SS");   foreach(string s in x) { } 
如这段代码,foreach语句也可以这样写:
                foreach (Object stemp in x)
                {
                    Console.WriteLine(stemp.ToString() + " ");
                }
foreach语句相比for的好处在于同样实现遍历,但去掉了迭代器,不需要进行边界检查。要知道数组越界是常见问题。
於黾 2014-08-26
  • 打赏
  • 举报
回复
如果foreach需要你自己强制转换,那跟for还有任何区别?
装逼之王 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
从你的标题就能看出,你肯定不是自己想出的这个问题,而是照抄人家文章里的个别字眼儿,然后故意来提问。 建议你提问时列出你之前已经过的参考文章。
冏,我有那么无聊吗? 我看《C井入门经典》第六版239页的代码时碰到的
  • 打赏
  • 举报
回复
从你的标题就能看出,你肯定不是自己想出的这个问题,而是照抄人家文章里的个别字眼儿,然后故意来提问。 建议你提问时列出你之前已经过的参考文章。
  • 打赏
  • 举报
回复
lz 你是拿网络上的文章来故意提问吧? 随便搜一下就有一堆类似文章:http://www.cnblogs.com/yukaizhao/archive/2011/10/19/csharp_box_unbox_2.html
threenewbee 2014-08-25
  • 打赏
  • 举报
回复
比如
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

foreach(string s in x)
{
}
编译器展开成等价如下形式的代码:
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

IEnumerator enumerator = (x).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      string element = (string)enumerator.Current; // here is casting occures **************
      // loop body;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}
注意编译器会在***********处增加强制类型转换。 如果ArrayList中的元素不都是string,会报运行时错误。

110,535

社区成员

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

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

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