问题标签 [idisposable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2283 浏览

c# - 这个 IDisposable 实现是否正确?

我永远记不起实现 IDisposable 接口的所有规则,所以我试图想出一个基类来处理所有这些并使 IDisposable 易于实现。我只是想听听你的意见,如果这个实现是好的,或者你是否看到了我可以改进的地方。这个基类的用户应该从它派生,然后实现两个抽象方法ReleaseManagedResources()ReleaseUnmanagedResources(). 所以这里是代码:

0 投票
4 回答
4779 浏览

.net - 无需处理的 XML 序列化

使用上面的代码可以完美地工作。但是,当我将其缩短为:

当我尝试在同一个测试中反序列化 users.xml 文件时出现以下异常:该进程无法访问文件“users.xml”,因为它正在被另一个进程使用。

原因似乎是 File.Create 方法返回一个打开的 FileStream,我无法关闭它,因为我没有保留它的引用。

我的坏,还是微软的?;-)

0 投票
4 回答
7581 浏览

c# - 这对于使用 IDisposable 处理对象是否正确

我有一个实现 IDisposable 接口的类。我正在使用网络客户端使用 AsyncDownloadString 下载一些数据。

我想知道我是否在构造函数和 web 客户端的 using 语句中正确声明了我的事件处理程序?这是在 Dispose 方法中删除事件处理程序的正确方法吗?

否决这是使用 IDisposable 接口的正确方法吗?

0 投票
13 回答
198127 浏览

c# - 在 C# 中使用 Finalize/Dispose 方法

C# 2008

我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑。我的问题如下:

  1. 我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?

  2. 但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现IDisposable允许该类的客户端使用“使用语句”?

    实现 IDisposable 只是为了让你的类的客户使用 using 语句是否可行?

    /li>
  3. 我在下面开发了这个简单的代码来演示 Finalize/dispose 的使用:

    /li>

关于源代码的问题:

  1. 这里我没有添加终结器,通常终结器会被GC调用,终结器会调用Dispose。由于我没有终结器,我什么时候调用 Dispose 方法?是必须调用它的类的客户端吗?

    因此,我在示例中的类称为 NoGateway,客户端可以像这样使用和处置该类:

    执行到 using 块的末尾时会自动调用 Dispose 方法,还是客户端必须手动调用 dispose 方法?IE

    /li>
  2. 我在WebClient课堂上使用该NoGateway课程。因为WebClient实现了IDisposable接口,这是否意味着WebClient间接使用了非托管资源?是否有严格的规则来遵循这一点?我怎么知道一个类使用了非托管资源?

0 投票
12 回答
105188 浏览

datatable - 我应该 Dispose() DataSet 和 DataTable 吗?

DataSet 和 DataTable 都实现了 IDisposable,因此,按照常规的最佳实践,我应该调用它们的 Dispose() 方法。

但是,从我目前所读到的内容来看,DataSet 和 DataTable 实际上没有任何非托管资源,因此 Dispose() 实际上并没有做太多事情。

另外,我不能只使用using(DataSet myDataSet...),因为 DataSet 有一个 DataTables 集合。

因此,为了安全起见,我需要遍历 myDataSet.Tables,处理每个 DataTable,然后处理 DataSet。

那么,在我的所有数据集和数据表上调用 Dispose() 是否值得?

附录:

对于那些认为应该处置 DataSet 的人:通常,处置模式是使用usingor try..finally,因为您想保证 Dispose() 将被调用。

然而,这对于一个集合来说变得非常难看。例如,如果对 Dispose() 的调用之一引发异常,您会怎么做?你吞下它(这是“坏的”),以便你可以继续处理下一个元素吗?

或者,您是否建议我只调用 myDataSet.Dispose(),而忘记在 myDataSet.Tables 中处理 DataTables?

0 投票
8 回答
16216 浏览

c# - 将 C# 的“使用”语句与自定义对象的函数一起使用,我是否需要实现 IDisposable?

我有一个这样的 sqlConnection 管理器类:

如果我使用带有“使用”语句的函数,例如:

using 语句是否会自动处理连接,因为conn.Connection()返回一个 SqlConnection 对象?或者,我是否必须在 SqlConn 类上实现 IDisposable 和自定义 Dispose 方法?

这甚至是一个好方法吗?我正在使用遗留代码,我还不能使用 ORM,但是有没有办法简化这个现有的模式来管理/创建 SQL 连接?

0 投票
5 回答
415 浏览

.net - 应该使用 USING 语句的案例列表

“File 和 Font 是访问非托管资源(在本例中为文件句柄和设备上下文)的托管类型的示例。还有许多其他类型的非托管资源和封装它们的类库类型。所有此类类型都必须实现 IDisposable 接口。如一条规则,当你使用 IDisposable 对象时,你应该在 using 语句中声明和实例化它。” - MSDN

是否存在应使用 USING 语句的此类情况的列表(访问非托管资源(如 FILE 和 FONT,...)的托管类型?

0 投票
7 回答
5919 浏览

c# - 考虑 C# 中的“一次性”关键字

您对如何在 .Net 中实现一次性对象有何看法?以及如何解决实现 IDisposable 类的重复性?

我觉得 IDisposable 类型不是他们应该成为的一等公民。太多的事情留给了开发商的摆布。

具体来说,我想知道是否应该在语言和工具中提供更好的支持,以确保正确实施和妥善处理一次性物品。

例如,在 C# 中,如果我的类需要实现一次性语义可以这样声明:

在这种情况下,编译器可以轻松生成 IDisposable 接口的实现。析构函数 ~MyDisposableThing 可以转换为应该释放托管资源的实际 Dispose 方法。

中间 C# 代码如下所示:

这将使代码更简洁,更少的样板代码处置代码,以及处置托管资源的一致方式。对于边缘情况和非托管资源,仍然支持手动实现 IDisposable。

确保正确处理实例是另一个挑战。考虑以下代码:

reader 变量永远不会超出方法的范围,但必须等待 GC 处理它。在这种情况下,编译器可能会引发 StreamReader 对象未显式释放的错误。此错误会提示开发人员将其包装在 using 语句中:

0 投票
3 回答
576 浏览

c# - 一次性

我正在尝试调整课程以适应刚刚完成的工作,但我无法解决问题。我的问题是如何识别句柄关闭 //CloseHandle(句柄)。我的问题是我无法调整以下代码。

0 投票
2 回答
2901 浏览

c# - C#:IEnumerator在 using 语句中

我很想知道该SingleOrFallback方法是如何在MoreLinq中实现的,并发现了一些我以前从未见过的东西:

为什么IEnumerator<T>using声明中?foreach这也是在使用on an时应该考虑的事情IEnumerable<T>吗?

附带问题:这种方法究竟做了什么?每当源序列不包含一个项目时,它是否返回后备项目?