C#中yield return用法分析

 更新时间:2014年09月05日 09:45:27   投稿:shichen2014  
这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下:

yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。

有这样的一个int类型的集合:

static List<int> GetInitialData()
{
  return new List<int>(){1,2,3,4};
}

需要打印出所有值大于2的元素。

不使用yield return的实现

static IEnumerable<int> FilterWithoutYield()
{
  List<int> result = new List<int>();
  foreach (int i in GetInitialData())
  {
 if (i > 2)
 {
   result.Add(i);
 } 
  }
  return result;
}

客户端调用:

static void Main(string[] args)
{
  foreach (var item in FilterWithoutYield())
  {
 Console.WriteLine(item);
  }
  Console.ReadKey(); 
}

输出结果:3,4

使用yeild return实现

static IEnumerable<int> FilterWithYield()
{
  foreach (int i in GetInitialData())
  {
 if (i > 2)
 {
   yield return i;
 }
  }
  yield break;
  Console.WriteLine("这里的代码不执行");
}

客户端调用:

static void Main(string[] args)
{
  foreach (var item in FilterWithYield())
  {
 Console.WriteLine(item);
  }
  Console.ReadKey(); 
}

输出结果:3,4

总结:

通过单步调试发现:

虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

第一种方法,客户端调用过程大致为:

使用yield return,客户端调用过程大致为:

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?

--因为,编译器会生成一个状态机来维护迭代器的状态。

简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • C# 超高面试题收集整理

    C# 超高面试题收集整理

    C# 超高面试题,学习c sharp的朋友可以看下,有说明地方的不足。是不是所有问题都有自己的解决方法。
    2010-03-03
  • WCF实现的计算器功能实例

    WCF实现的计算器功能实例

    这篇文章主要介绍了WCF实现的计算器功能,结合具体实例形式较为详细的分析了WCF实现计算器功能的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 总结C#处理异常的方式

    总结C#处理异常的方式

    这篇文章介绍了C#处理异常的方式总结,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C#获取图片的后缀名解析

    C#获取图片的后缀名解析

    这篇文章主要介绍了C#获取图片的后缀名解析,需要的朋友可以参考下
    2014-02-02
  • C#中类与接口的区别个人总结

    C#中类与接口的区别个人总结

    这篇文章主要介绍了C#中类与接口的区别个人总结,本文讲解了类与接口的区别、接口的用处主要体现在下面几个方面、一些接口的疑问等内容,需要的朋友可以参考下
    2015-06-06
  • c#使用filesystemwatcher监视文件系统的变化

    c#使用filesystemwatcher监视文件系统的变化

    对于一个文件夹的改变,C#这边有自己的类来实现,我们不需要关心它的内部实现机制,不需要关心它底层调用哪些API,我们只需要关心如何去调用它,如何让它帮助我们记录文件夹的修改情况即可,下面我们就实现它
    2014-01-01
  • 详解c#与python的交互方式

    详解c#与python的交互方式

    这篇文章主要介绍了详解c#与python的交互方式,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • 利用C#实现记事本的功能的示例代码

    利用C#实现记事本的功能的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现简单的记事本的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C# 从Excel读取数据向SQL server写入

    C# 从Excel读取数据向SQL server写入

    这篇文章主要介绍了C# 从Excel读取数据向SQL server写入的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#为配置文件加密的实现方法

    C#为配置文件加密的实现方法

    这篇文章主要介绍了C#为配置文件加密的实现方法,可实现对配置文件中的敏感信息进行加密,非常具有实用价值,需要的朋友可以参考下
    2014-10-10

最新评论