为什么 IEnumerator 继承自 IDisposable 而非泛型 IEnumerator 则不然?

2023-12-04

我注意到通用的IEnumerator<T>继承自 IDisposable,但非泛型接口 IEnumerator 则不继承。为什么要这样设计呢?

通常,我们使用foreach语句来遍历IEnumerator<T>实例。 foreach 的生成代码实际上有一个 try-finally 块,它在 finally 中调用 Dispose() 。


Basically it was an oversight. In C# 1.0, foreach never called Dispose 1. With C# 1.2 (introduced in VS2003 - there's no 1.1, bizarrely) foreach began to check in the finally block whether or not the iterator implemented IDisposable - they had to do it that way, because retrospectively making IEnumerator extend IDisposable would have broken everyone's implementation of IEnumerator. If they'd worked out that it's useful for foreach to dispose of iterators in the first place, I'm sure IEnumerator would have extended IDisposable.

然而,当 C# 2.0 和 .NET 2.0 出现时,它们有了一个新的机会——新的接口、新的继承。扩展接口更有意义IDisposable这样你就不需要在finally块中进行执行时检查,现在编译器知道迭代器是否是一个IEnumerator<T>它可以发出无条件调用Dispose.

编辑:这对于Dispose在迭代结束时调用(无论如何结束)。这意味着迭代器可以保留资源 - 这使得它可以逐行读取文件。迭代器块生成Dispose确保任何实施finally与迭代器的“当前执行点”相关的块在其被释放时执行 - 因此您可以在迭代器中编写正常的代码,并且应该适当地进行清理。


1 Looking back at the 1.0 spec, it was already specified. I haven't yet been able to verify this earlier statement that the 1.0 implementation didn't call Dispose.

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

为什么 IEnumerator 继承自 IDisposable 而非泛型 IEnumerator 则不然? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 如何使用Pivot_longer将宽类型数据重塑为具有多个变量的长类型数据

    我想问如何将以下数据框从宽类型重塑为长类型 宽类型数据如下 重塑前的宽类型数据 long 类型数据 即我想要获取的数据帧 如下所示 整形后的Long类型数据 如果您能给我使用更长的枢轴来完成此操作的提示 我将非常感激 我可以通过 BLS 和
  • 图表的中心

    给定一棵无向树 其无权边具有 N 个顶点和 N 1 个边 并且数量为 K 找到 K 个节点 以便树中的每个节点与 K 个节点中的至少一个节点的距离在 S 范围内 另外 S 必须是尽可能小的 S 因此 如果 S 我尝试解决这个问题 但是 我觉
  • 在现有 Java 7 代码中使用 Java 8 可选

    我有一项作业 需要将以下 Java 8 之前的代码转换为 Java 8 代码 以下只是一种让我很难完成的方法 public static List
  • 嵌套 mysql 查询的性能损失

    什么是性能损失SELECT FROM Table VS SELECT FROM SELECT FROM Table AS A AS B 我的问题是 首先 SELECT 是否涉及表中行的迭代 或者它只是将所有行作为一个块返回而不进行任何迭代
  • C 中是否有类似于 Java 字符串 'charAt()' 方法?

    我正在尝试将一段代码从 Java 转换为 C 但我被困在这里 试图在每个位置获取一个字符 char ch line while pos lt line length ch line charAt pos C 中有没有类似的东西可以转换行ch
  • django xlsxwriter 中的日期时间问题

    我正在尝试在 django 视图中创建导出到 Excel 的功能 如下所示 def export myreport request sd ed from xlsxwriter workbook import Workbook import
  • 使用 Google Maps API 根据地址显示房屋的街景

    我正在尝试使用 Google 地图根据地址显示房屋的街景 我创建了一个jsfiddle基于此tutorial 小提琴正在显示默认的初始地址 但我不知道按下按钮时如何将新地址传递到街景代码中 这是 HTML h3 Enter an Addre
  • jQuery ajax 安全性

    我有以下 ajax 调用 它检查用户是否是付费会员 如果是 则相应地运行某些功能 这可行 但我担心安全性 如果有人在控制台强制中更改此 ajax 代码怎么办 button无需执行任何操作即可成功运行功能 我可以在仍然使用 jQuery aj
  • 根据 Symfony 中的另一个字段值验证一个字段

    我在 Symfony 表单中有两个相关字段 object status and cryopreservation method 第一个不能为空 并存储三个可能的选择之一 liquid solid or cryopreserved 仅当记录有
  • 为什么调试模式和运行模式下的保留计数不同?

    我知道 ARC 和 MRC 是如何工作的 但我在测试下面的代码时感到困惑 我不知道为什么会发生这种情况 为什么同一个问题在调试模式和运行模式下的保留计数不同 NSMutableArray a NSMutableArray array a a
  • 让画布无限大

    我目前正在使用画布 在上面画了一些感兴趣的区域 它们由正方形组成 可以通过鼠标单击来移动 即 每次我在画布上单击时 所选区域将以我的光标位置为中心 我当前的问题是我想添加以下功能 当我单击画布边缘附近 左或右 时 如果正方形的一部分不在画布
  • 将新行添加到数据表

    我有一个DataGrid绑定到具有一张表和一列 FooTable 和 FooName 的数据库 使用以下代码 我可以绑定DataGrid to DataTable并显示数据库数据 但是当我每次添加新行时DataSet Add Click 没
  • JAXB - 具有递归依赖性的编组

    有人尝试用递归引用封送 JAXB 对象吗 我有以下课程 public class A private Long id private String name private List a aList 我想将其编组为 a a a a a a
  • 列表视图行布局的动态变化也会影响其他行

    我正在使用 ListView 每个列表元素上都有几个按钮 当单击一行上的按钮时 该按钮应该消失 单击时单击的按钮消失 没关系 问题是其他一些列表元素按钮也消失了 例如 当我单击第一个元素按钮时 它也会影响第 6 11 16 个元素中的按钮
  • 将文本添加到点阵条形图中的面板

    我尝试向具有多个面板的格子条形图中的条形添加标签 我最终得到了太多的标签 每个标签都在每个面板中 这是我的代码 library lattice data iris barchart seq 1 50 Petal Width Petal Le
  • 也可以将 swift println 日志写入文件吗?

    将日志写入文本文件也是一种简单的方法吗 我需要一个崩溃日志来分析何时出现问题 但我已经在代码中使用了 println al Use String writeToFile lt path String gt atomically lt Boo
  • 在 DevExtreme/Phonegap 上使用 FCM 推送通知

    我使用 DevExtreme 开发了我的应用程序 这是一个基于 PhoneGap 的多平台工具 现在 我尝试使用phonegap plugin push 管理推送通知 我的第一个简单目标是发送接收来自 FCM Firebase 云消息传递
  • 线性规划 - Google ortool - 错误的决策变量最终值

    我正在尝试解决线性规划问题 以下是问题的具体情况 我有一个网络流问题已转换为线性规划问题 因此 所有流量约束 例如容量 流量守恒等 都必须强制执行 我的目标是最小化成本 决策变量 我通过定义字典并在这 128 个位置中的每个位置添加决策变量
  • 如何在wildfly 8.2.0服务器中配置ssl?

    我想要我的网络应用程序的安全连接 所以 我想为我的 Wildfly 8 2 0 服务器配置 ssl 我已在独立 配置文件夹中创建并存储了 keystore 文件 keytool genkey alias foo keyalg RSA key
  • 为什么 IEnumerator 继承自 IDisposable 而非泛型 IEnumerator 则不然?

    我注意到通用的IEnumerator