永发信息网

要实现foreach遍历要继承什么接口

答案:2  悬赏:0  手机版
解决时间 2021-03-13 13:57
要实现foreach遍历要继承什么接口
最佳答案
在使用FOREACH对集合进行遍历的时候,要求被遍历的对象必须实现了IENUMABLE接口,而该接口的唯一成员方法GETENUMATOR返回实现了IENUMATOR接口的实例对象。

检测IENUMATOR,发现有3个成员,分别是:CURRENT、MOVENEXT、RESET,CURRENT返回当前的成员对象;MOVENEXT把指针向下移动一个位置,如果存在实例成员则返回true,否则返回false,是FOREACH判断循环结束的条件;RESET则重置循环指针。

通过以上分析,想当然的在定义实现了IENUMABLE接口的类时一起实现IENUMATOR接口,也没有发现问题。直到一天需要对自定义的集合连续进行两次FOREACH的时候,发现第一次OK,第二次出现了问题,郁闷呀。调试很久都解决不了问题。

多方面测试、跟踪后,发现FOREACH并不会调用RESET这个重置方法,从而当第二个FOREACH执行的时候,成员指针已经指到最后面,MOVENEXT永远返回false,而之前想当然的认为在调用FOREACH的时候,要么开始执行RESET,要么最后执行RESET,结果不然。

反编译MS对集合类定义的代码,发现,类在实现IENUMABLE的方法GETENUMATOR的时候,是全新的创建了一个实现了IENUMATOR接口内部类实例,所以不会出现连续FOREACH时数据不正常的情况。

MS为什么采用这样的方案实现IENUMATOR呢?想想也是自己蠢呀,如果一个实例集合在多线程中被同时FOREACH,那指针还不混乱?这个实现方案是MS保证集合类实例在多线程环境安全的至要保证。

用foreach循环一次性遍历a数组

int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组a
foreach(int i in a)
{
Console .WriteLine (i);
}

这两种代码执行的结果是一样的都是 每行一个元素,共8行,元素分别是1 2 3 4 5 6 7 8
全部回答
C#的foreach需要类型继承IEnumerable或IEnumerable
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
艺翔图文我想知道这个在什么地方
华达酒楼地址在哪,我要去那里办事
★字谜:雨
横沥供销二门市地址有知道的么?有点事想过去
100的负二分之一次方怎么算啊
久好精品杠子馍地址在什么地方,想过去办事
金凤凰窗帘地址在什么地方,想过去办事
细河街在哪里啊,我有事要去这个地方
每天惠智慧便利店(立业超市)地址在什么地方,
航管业务楼地址在什么地方,想过去办事
nabour中文是什么意思
急求剑桥雅思真题1-8电子版的文字版,非照片
近期各位觉得订购什么笔记本合适?想了解下。
悦食尚地址有知道的么?有点事想过去
牌楼出口(牌楼互通出口西北向)地址在什么地方
推荐资讯
张记放心肉铺地址有知道的么?有点事想过去
宾馆里门童帮房客拿行李,从外面拿到哪里?是
单家集虎斌平价牛羊肉在什么地方啊,我要过去
鹿泉区公安局宜安镇派出所在哪里啊,我有事要
小林菜饭馆地址有知道的么?有点事想过去
严村地址在哪,我要去那里办事
求一些有趣的灯谜、古术算题,对联等等等
鼎味美食城我想知道这个在什么地方
市蛇纹石矿地址有知道的么?有点事想过去
超香园蛋糕店在哪里啊,我有事要去这个地方
四川音乐学院王光祈学术研究中心我想知道这个
东营市中医医院住院部在什么地方啊,我要过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?