C#关键字—yield

来源:互联网 发布:查看被占用的端口 编辑:程序博客网 时间:2024/06/02 20:34

最近觉得自己对于很多C#的基本的,很有用的东西都是一知半解,所以就在专业时间之余多多研究一下C#。

其实关于这个关键字的使用在MSDN中介绍的已经非常好了;网上很多的关于这个关键字的分享都是来自于它,但是大家基本上都是介绍了如何使用,但是并没有说为什么使用,即使用它的作用到底是什么呢?什么时候使用呢?

这里就根据MSDN说说自己的理解,如果有错误或者补充,看到的请提醒小弟~


在语句中使用 yield 关键字,表示在该关键字所在的方法、运算符或 get 访问器是迭代器。 通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerable 和 IEnumerator 模式时无需其他显式类(保留枚举状态的类,有关示例,请参阅 IEnumerator)。

这是MSDN翻译过来的原话,那么什么是无需其他显示类呢?括号里的介绍是保留枚举状态的类~好吧,也不是那么容易理解的~~

我的理解是因为我们在操作IEnumerable或者是IEnumerator接口的集合时,我们使用MoveNext()或者Current属性获取当前遍历的集合中对象时还是需要将获取到的当前对象添加到一个List或者IList中:

IList<string> FindStrs(IEnumerable<string> strs){    var str= new List<string>();    foreach(var curStr in strs)    {        if(curStr == "Str")            str.Add(curStr );    }    return str;}

否则我们就实在不好处理我们遍历之后获取到的对象集合~但是使用yeild关键字之后我们可以这样:

IEnumerable<string> FindStrs(IEnumerable<string> strs){    foreach(var curStr in strs)    {        if(curStr == "Str")            yield return curStr;    }}

之后你想如何操作这个枚举集合就是你自己的意愿了~


还有一个好处是可以自由的操作这个集合,返回任何我们想要的过滤方式,比如我现在想要获取集合中第2,3三个位置的对象(当然这个集合时大于3的~):

IEnumerable<string> FindStrs(IEnumerable<string> strs){    int position=0;    foreach(var curStr in strs)    {        if(position==1||position==2)            yield return curStr;//返回对象            yeild return position.ToString();        if(position>2)            yield break;//跳出        position++;    }}

小结

所以综上所述,yield关键字最主要的作用就是可以控制集合进行自定义过滤操作,在一些特殊的需求中可以起到关键作用~!


补充

文章参考了Artech的博客从yield关键字看IEnumerable和Collection的区别~

文章中提及了对于yield关键字的作用与控制yield的“延迟赋值”~

0 0