C#中的foreach是如何实现的? [复制]

2024-04-21

究竟是怎样的foreach在 C# 中实现?

我想象它的一部分看起来像:

var enumerator = TInput.GetEnumerator();
while(enumerator.MoveNext())
{
  // do some stuff here
}

但我不确定到底发生了什么。使用什么方法返回enumerator.Current每个周期?它是否返回[每个周期]或者是否需要一个匿名函数或其他东西来执行主体foreach?


它不使用匿名函数,不。基本上编译器将代码转换成某种东西大致等同到您在此处显示的 while 循环。

foreach isn't函数调用 - 它内置于语言本身中,就像for循环和while循环。它不需要返回任何内容或“获取”任何类型的函数。

注意foreach有一些有趣的皱纹:

  • 当迭代数组(在编译时已知)时,编译器可以使用循环计数器并与数组的长度进行比较,而不是使用IEnumerator
  • foreach将在最后处理迭代器;这很简单IEnumerator<T>这延伸了IDisposable,但作为IEnumerator doesn't,编译器在执行时插入一个检查来测试迭代器是否实现IDisposable
  • 您可以迭代未实现的类型IEnumerable or IEnumerable<T>,只要您有适用的GetEnumerator()返回具有合适类型的方法Current and MoveNext()成员。正如评论中所指出的,类型可以also实施IEnumerable or IEnumerable<T>明确地,但有一个公共GetEnumerator()返回除以下类型之外的类型的方法IEnumerator/IEnumerator<T>. See List<T>.GetEnumerator() http://msdn.microsoft.com/en-us/library/b0yss765.aspx例如 - 这可以避免在许多情况下创建不必要的引用类型对象。

有关详细信息,请参阅 C# 4 规范的第 8.8.4 节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中的foreach是如何实现的? [复制] 的相关文章

随机推荐

  • (再次)在独立脚本中使用 Django ORM

    我正在尝试在一些独立的屏幕抓取脚本中使用 Django ORM 我知道这个问题以前曾被问过 但我无法为我的特定问题找到一个好的解决方案 我有一个带有已定义模型的 Django 项目 我想做的是在我的抓取脚本中使用这些模型和 ORM 我的目录
  • 同步客户端-服务器数据库

    我正在寻找一些通用策略 用于将中央服务器上的数据与并不总是在线的客户端应用程序同步 在我的特定情况下 我有一个带有 sqlite 数据库的 Android 手机应用程序和一个带有 MySQL 数据库的 PHP Web 应用程序 用户将能够在
  • 如何避免选择 Internet Explorer 第一个按钮?

    我有一张带有多个文本字段和一个按钮的表单 当我输入其中一个文本字段时 提交按钮会突出显示 如果我在键入时按 Enter 键 则会按下该按钮 因此我会出现意外的行为 因为我的页面已提交 Firefox 不会这样做 是否有一些属性或配置可以避免
  • Xcode C++ 和 Objective-C 重构

    有没有办法refactorXcode 中的混合 C Objective C 代码 我正在使用 Cocos2D 和 Box2D 编写游戏 而 Box2D 是用 C 编写的 因此我编写的每个类都应该具有 mm 扩展名 因此当我尝试例如重命名变量
  • 如何强制增量 Foundry Transforms 作业以非增量方式构建而不影响语义版本?

    如何强制特定数据集以非增量方式构建而不更改转换存储库中的语义版本 有关我们具体用例的详细信息 我们有大约 50 个数据集 由单个增量 Python 通过手动注册和 for 循环定义 此转换的输入可以是 100 到 10000 个小 gzip
  • 在 PHP 中生成 wav 音调

    我想在 php 中生成正弦音 但是构建我的 wav 时我需要给出以字节为单位的值 我不知道该怎么做 这是我的代码 freqOfTone 440 sampleRate 44100 samplesCount 80000 amplitude 0
  • 如何启动已停止的线程

    我创建一个新线程并从主线程启动它 m MyThread new Thread HandleMyThread m MyThread IsBackground true m MyThread Start private void HandleM
  • 虾表设置标题行背景色

    pdf table header row1 row2 width 490 cell style size 7 align center do style row 0 padding 4 2 font Prawn BASEDIR data f
  • 在 Oracle 计算实例 (ubuntu-20.04) 上打开端口 19132

    我创建了一个运行 Ubuntu 20 04 的 Oracle 云基础设施计算实例 我正在尝试打开端口 19132 根据我发现的另一个问题在 Oracle Cloud Infrastructure 计算节点上打开端口 80 https sta
  • Mac 终端 - 打开终端时出现“释放的指针未分配”错误

    在 mac 上打开终端时收到以下消息 上次登录 3 月 11 日星期二 14 33 24 在控制台上 登录 291 0x7fff78af9310 malloc 对象 0x7f974be006f0 的错误 正在释放的指针未分配 在malloc
  • 映射服务使用的网络驱动器

    假设某些 Windows 服务使用需要映射网络驱动器且不需要 UNC 路径的代码 当服务启动时 如何使驱动器映射可供服务会话使用 以服务用户身份登录并创建持久映射不会在实际服务的上下文中建立映射 使用此功能需要您自担风险 我已经在XP和Se
  • Java - 堆与直接内存访问

    我最近遇到sun misc Unsafe类 允许用户以类似于 C 的方式分配 解除分配和一般访问内存 我读过一些解决这个问题的博客 例如 堆内存和直接内存哪个更快 http mentablog soliveirajr com 2012 11
  • 如何在功能测试中测试电子邮件(Symfony2)

    我正在尝试在功能测试中测试电子邮件 我的源代码是一样的食谱的例子 http symfony com doc current cookbook email testing html 控制器 public function sendEmailA
  • PySpark 中按降序排序

    我正在使用 PySpark Python 2 7 9 Spark 1 3 1 并有一个数据框 GroupObject 我需要按降序过滤和排序 试图通过这段代码来实现它 group by dataframe count filter coun
  • 使用 F# 的爱因斯坦之谜解决方案 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在找爱因斯坦之谜 http en
  • 将最后一个值替换为之前的值

    我有一组不完整的三元组 a np arange 10 3 1 print a 1 1 1 2 2 2 3 3 3 4 Or a1 np arange 11 3 1 print a1 1 1 1 2 2 2 3 3 3 4 4 最后的值为4
  • 是否可以让 valgrind 忽略某些库?

    或者最好是全部而不只是我的代码 我的程序使用 Gtk Loudmouth 和其他一些东西 而这两个 以及它们背后的一些 libgcrypto libssl 本身导致了如此多的错误 以至于我无法检测到我自己的错误 是否有可能让 valgrin
  • 适用于多个项目的多个 Rails 版本

    我想在一个项目中使用 Rails 2 2 2 在另一个项目中使用 Rails 2 3 2 两者均已安装 What is rails 2 2 2 version应该做的 我读到它使 2 2 2 成为工作版本 也就是说 从那时起将使用的版本 但
  • 当我使用 gridview:true 时, afterInsertRow : function(ids) 方法不执行

    当我设定gridview to true gridview true 在我们的jqGrid中增加jqGrid的性能 方法如下插入行后 或者其他类似的方法不被执行 以下是我的jgGrid的代码 jQuery displaylistGrid j
  • C#中的foreach是如何实现的? [复制]

    这个问题在这里已经有答案了 究竟是怎样的foreach在 C 中实现 我想象它的一部分看起来像 var enumerator TInput GetEnumerator while enumerator MoveNext do some st