C#中的foreach
在编写C#代码时,我们会发现使用foreach循环会比使用for循环方便,不需要进行数据类型的强制转换,不需要使用下标!通过帮助文档的查看可知,如果要对一个对象使用foreach进行循环的话则此对象的类型必须拥有GetEnumerator方法,此方法是在IEnumerable接口下的,但是否实现此接口无所谓!GetEnumerator方法需要返回一个IEnumerator的实例,因为在进行foreach遍历时会使用到一个属性:Current和一个方法:MoveNext!以下是带有注释的源代码:usingSystem;usingSystem.Collections;namespaceConTest01{//////Class1的摘要说明。///classClass1{//////应用程序的主入口点。///[STAThread]staticvoidMain(string[]args){Personsp=newPersons(\"jack\foreach(stringsinp){Console.WriteLine(s);}}}publicclassPersons{publicstring[]m_Names;publicPersons(paramsstring[]Names){this.m_Names=newstring[Names.Length];Names.CopyTo(this.m_Names,0);}publicstringthis[intindex]{get{returnthis.m_Names[index];}set{this.m_Names[index]=value;}}#regionIEnumerable成员//如果此类需要被foreach遍历则必须拥有此方法,至于是否实现IEnumerable接口倒是无所谓publicIEnumeratorGetEnumerator(){//返回一个IEnumerator的实例returnnewPersonsEnumerator(this);}#endregion}publicclassPersonsEnumerator:IEnumerator{privateintindex=-1;privatePersonsP;publicPersonsEnumerator(PersonsP){this.P=P;}#regionIEnumerator成员//重置方法publicvoidReset(){this.index=-1;}//得到当前值的属性,是只读,因此在进行foreach遍历时不能修改遍历到的元素内容publicobjectCurrent{get{returnthis.P[index];}}//将当前实例内部的索引前进一位,并判断前进后是否还有元素publicboolMoveNext(){inttempIndex=++this.index;if(tempIndex>=this.P.m_Names.Length){returnfalse;}else{returntrue;}}#endregion}