问题标签 [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 投票
6 回答
4397 浏览

c# - 带有终结器但没有 IDisposable 的单例

这是我从“CLR via C#”、“Effective C#”和其他资源中对 IDisposable 和终结器的理解:

  • IDisposable 用于确定性地清理托管和非托管资源。
  • 负责非托管资源(例如文件句柄)的类应实现 IDisposable 并提供终结器以确保即使客户端代码未在实例上调用 Dispose() 也能清理它们。
  • 只负责托管资源的类不应该实现终结器。
  • 如果你有一个终结器,那么你必须实现 IDisposable(这允许客户端代码做正确的事情并调用 Dispose(),而终结器可以防止在他们忘记时泄漏资源)。

虽然我理解并同意上述所有内容,但在一种情况下,我认为打破这些规则是有意义的:一个负责非托管资源的单例类(例如提供对特定文件的单点访问) )。

我认为在单例上使用 Dispose() 方法总是错误的,因为单例实例应该在应用程序的整个生命周期内都存在,如果有任何客户端代码调用 Dispose() 那么你就被塞满了。但是,您需要一个终结器,以便在卸载应用程序时终结器可以清理非托管资源。

因此,在我看来,拥有一个带有不实现 IDisposable 的终结器的单例类似乎是一件合理的事情,但这种类型的设计与我所理解的最佳实践背道而驰。

这是一个合理的方法吗?如果不是,为什么不呢?有什么更好的选择?

0 投票
2 回答
2134 浏览

c# - 使用 Silverlight 适当实现 IDisposable?

我正在使用 MVVM 模式开发 Silverlight 应用程序。我的 ViewModel 当前包含一个表示模型对象集合的属性:

它还有几种方法可以使用从 Web 服务返回的数据填充该集合。

由于此类的实例可能在应用程序运行时创建和销毁,我应该实现IDisposable并将属性的引用设置为 null 还是该类的销毁足以删除对集合 tis 属性引用的所有引用?是否有任何警告可能会留下参考?

谢谢。

0 投票
3 回答
9373 浏览

.net - 处置时托管资源和本机资源有什么区别?(。网)

我正在阅读有关如何实现 IDisposable 的 MSDN 文章,但我不确定文章中引用的托管资源和本机资源之间的区别。

我有一个类,在处理它时必须处理它的 2 个字段。我应该将它们视为托管资源(仅在处置 = true 时处置)还是本机资源?

0 投票
4 回答
1726 浏览

c# - 如果将通用集合实例化为包含 iDisposable 项,这些项是否会被释放?

例如:

如果我没有明确地将每个项目出列并单独处理它们,那么在调用 Clear() 时是否会处理剩余的项目?当队列被垃圾收集时怎么样?

假设答案是“否”,那么最佳实践是什么?您是否必须始终遍历队列并处理每个项目?

这可能会变得很难看,特别是如果您必须尝试..finally 围绕每个处置,以防引发异常。

编辑

因此,通用集合的用户似乎有责任知道,如果这些项目是一次性的(意味着它们可能正在使用不会被垃圾收集器清理的非托管资源),那么:

  1. 当你从集合中移除一个项目时,确保你 Dispose() 它。
  2. 不要调用 Clear()。遍历集合并处理每个项目。

也许通用集合的文档应该提到这一点。

0 投票
3 回答
2695 浏览

c# - 包含实现 IDisposable 的项目的会话

在 ASP.NET 中,如果项目保留在实现 IDisposable 的会话状态,但在会话到期时从未被应用程序专门删除和处置,是否会对 Dipose() 中的任何代码将执行的对象调用 Dispose?

0 投票
4 回答
11677 浏览

.net - 我是否应该在 HttpWebResponse 上调用 Close,即使它在 using 语句中?

我有一些类似的代码,这段代码被大量使用:

该代码今天运行良好,但与服务器的连接保持打开了相当长的一段时间。(使用 TCPView 检查)

显式调用该Close()方法有好处吗?是推荐还是不推荐,为什么?

0 投票
2 回答
1488 浏览

c++-cli - 我可以阻止 C++/CLI 将 IDisposable 添加到我的 ref 类吗?

IDisposable当您在 ref 类上实现析构函数时,C++/CLI 会为您生成脚手架。此外,如果您没有实现析构函数,但您的类有一个成员变量 implements IDisposable,那么IDisposable它会再次在您的类上自动实现。IDisposable它非常有用,并且比C# 中的处理方式要好得多。

在实现一个持有msclr::com::ptr(包含 RCW 的智能指针)的 ref 类时,我遇到了这种行为。

我的特定情况下,我的类引用的 COM 对象不会“锁定”某些非托管资源,它实际上只是占用了 CLR 看不到的一些非托管内存。因此,我想通过不实现IDisposable该类来避免混淆我的 ref 类的用户。相反,我想通过使用 GC API 添加适当的内存压力,让 CLR 知道 COM 对象的存在。

所以,问题是:有没有办法抑制IDisposable在不实现析构函数但持有IDisposable成员变量的 ref 类上的实现?

注意:这通常是错误的做法,因为它会阻止该类的用户确定性地处理底层 COM 对象,但考虑到特定情况,暴露IDisposable可能会混淆我的 ref 类的用户,因为它确实不需要 Dispose 有问题的 ref 类。

我想一种选择是在没有析构函数的情况下实现 msclr::com::ptr 的变体。

任何其他抑制自动添加 IDisposable 的方法将不胜感激。谢谢。


回答

声明_aComObject为 msclr::com::ptr ( msclr::com::ptr<IWhatever>^) 的句柄。编译器不会将其Test视为 comptr 对象的“所有者”,并且不会在删除 Test 时释放它。

0 投票
8 回答
1601 浏览

c# - 我应该将 Dispose 逻辑分离到部分类文件中吗?

在重构一些 C# 类时,我遇到了实现 IDisposable 的类。

我不假思索地为每个实现 IDisposable 接口的类创建了部分类文件。

例如)对于 Stamper.cs -> Stamper.cs + Stamper.Dispose.cs 其中Stamper.cs包含用于标记的实际逻辑,而Stamper.Dispose.cs包含处置逻辑

当我查看代码时,Stamper.cs 现在看起来更加清晰易读(现在大约 52 行而不是 100 行,大约 50 行只是一个清理处置代码)

我在这方面走得太远了吗?

*编辑:感谢大家的意见 - 我决定将两个文件合二为一。我遇到的问题是我实际上在更新实际逻辑后忘记更新 IDisposable 实现。

此外,在源代码中的方法之间导航没有太大问题。第一个原因似乎不仅仅是在我的具体情况下坚持使用一个文件解决方案的原因。

0 投票
19 回答
379782 浏览

c# - 正确使用 IDisposable 接口

我通过阅读Microsoft 文档知道该接口的“主要”用途IDisposable是清理非托管资源。

对我来说,“非托管”意味着数据库连接、套接字、窗口句柄等。但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该处理给你的。

例如:

我的问题是,这是否会使垃圾收集器使用的空闲内存MyCollection比通常更快?

编辑:到目前为止,人们已经发布了一些使用 IDisposable 清理非托管资源(如数据库连接和位图)的好例子。但是假设在上面的代码中包含一百万个字符串,并且您现在_theList想释放该内存,而不是等待垃圾收集器。上面的代码能做到这一点吗?

0 投票
4 回答
933 浏览

c# - 需要在使用 TcpClient 的类上实现终结器?

我有一个MyClass使用(作为私有字段)TcpClient对象的类(比如说)。MyClass实现方法中的IDisposable调用。TcpClient.CloseDispose

我的问题是MyClass还应该实现一个终结器来调用Dispose(bool Disposing)以释放TcpClient’s非托管资源,以防MyClass.Dispose调用代码不调用它?

谢谢