博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# for 和 foreach 的区别
阅读量:5166 次
发布时间:2019-06-13

本文共 918 字,大约阅读时间需要 3 分钟。

foreach

能够进行foreach的类型结构,都必须实现IEnumerable接口。

IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对象。

IEnumerator接口,有Current只读属性,MoveNext方法,Reset方法。

第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,

以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.

期间GetList()方法只执行一次.

比如类型结构 TestForeach 一个对象tf ,在进行foreach的时候,比如如下:

1 foreach(var a in tf)2 {3   console.writeLine(a.toString());4 }

程序运行到var a in tf时,实际上,调用了TestForeach的GetEnumerator()方法,返回一个a,当运行完console.writeLine(a.toString());后,继续运行 var a in tf,其实是调用了 上一次的a.MoveNext()放法,直到a.MoveNext=false foreach运行完毕。

 

for

for 循环靠下标定位.    list[3] 相当于 *(list + 3).

for(int i = 0; i < GetCount(); i++) {
  .... } = int i = 0; while(i < GetCount()) {
  ... }

for 循环每次循环会调用 GetCount() 来比较长度. 而 foreach 不考虑长度,只调用一次GetList().

 

结论.

在固定长度或长度不需要计算的时候for循环效率高于foreach.

在不确定长度,或计算长度有性能损耗的时候,用foreach比较方便.

 

并且foreach的时候会锁定集合中的对象.期间不能修改.

转载于:https://www.cnblogs.com/HKKD/p/7411548.html

你可能感兴趣的文章
mysql索引的艺术
查看>>
IBM RSA 的语言设置
查看>>
《http权威指南》阅读笔记(二)
查看>>
faster r-cnn cudnn版本不兼容问题
查看>>
[置顶] ListBox控件的数据绑定
查看>>
链表插入排序
查看>>
http://blog.csdn.net/yunye114105/article/details/7997041
查看>>
设计模式这个东西 刚刚发现几种模式好像大同小异啊
查看>>
关于 主键和外键
查看>>
python集合的交,差,并,补集合运算汇总
查看>>
校园分期支付的机遇和风险
查看>>
怕忘记-windows 2003服务器安装Node.js NPM
查看>>
一鍵分享(優化后)
查看>>
dcm4che 的依赖无法下载
查看>>
cygwin主要命令
查看>>
多线程存在哪些风险
查看>>
洛谷P2692 覆盖 题解
查看>>
Linux下清理内存和Cache方法见下文:
查看>>
【AngularJs-模块篇-Form篇】
查看>>
支持向量基
查看>>