NewBorn

凡心所向,素履以往;生如逆旅,一苇以航

导航

C# 特性之迭代器

研究下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是只跳出一层循环,后面的方法仍要执行。

posted on 2019-06-06 10:24  K丶Formular  阅读(109)  评论(0编辑  收藏  举报