研究下C#各版本特性。
C# 2.0特性:迭代器 (顺带熟悉一波yield的用法)
#region 特性测试 -- 迭代器 private void button8_Click(object sender, EventArgs e) { IEnumerator enumrator = GetEnumerator(); //不会执行命令 var value = string.Empty; while (enumrator.MoveNext()) //首次调用【yield return -1】 之后进入【for】循环 { value += enumrator.Current ?? enumrator.Current.ToString(); value += "^"; if (value.Length > 10) break; } MessageBox.Show(value); } public System.Collections.IEnumerator GetEnumerator() { yield return -1; for (int i = 1; i < 100; i++) { yield return i; } } #endregion
代码调试说明:
调用GetEnumerator()命令后,不会执行命令
当调用【MoveNext】后,首次调用【yeild return -1;】,之后会进入for循环获取数据,
当while循环中【break】后,【For】循环不会再往下执行,【GetEnumrator】方法结束
说明下:yield return 和 yield break的区别
迭代器中使用yield return来返回值,用yield break来结束迭代器。
若将上述代码 【yield return i;】 更换为【yield break;】那么,MoveNext 第一次返回 -1后,第二次就会直接结束方法GetEnumrator
yield break 和 return区别
迭代器中的yield break想当于普通方法中使用的return,直接终止方法(不仅仅只是终止循环,是终止整个方法),而不执行yield break后面的语句。
但是yield break和return的区别是,yield break返回一个不为null,但是count为0的IEnumerable集合,但是return 只能返回return null,return null会造成使用者在使用该返回值时抛出空引用异常。实验发现,在迭代器中应用return null,直接编译不通过
yield break和break的区别是:
yield break是跳出所有循环,直接终止方法,而break是只跳出一层循环,后面的方法仍要执行。