问题标签 [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 回答
11199 浏览

c# - 我什么时候可以处理 IDisposable WPF 控件,例如 WindowsFormsHost?

WPF 控件 WindowsFormsHost 继承自 IDisposable。

如果我有一个包含上述某些控件的复杂 WPF 可视化树,我可以在关机期间使用什么事件或方法来调用 IDispose?

0 投票
12 回答
9745 浏览

c# - 处理 .NET IDisposable 对象

using我在 C# 中工作,对于使用块来声明实现的对象,我一直很松懈IDisposable,显然你总是应该这样做。但是,我看不到一个简单的方法来知道我何时滑倒。Visual Studio 似乎没有以任何方式表明这一点(我只是错过了什么吗?)。我是不是应该每次声明任何东西时都检查一下帮助,并逐渐建立一个百科全书式的记忆,哪些对象是一次性的,哪些不是一次性的?似乎不必要、痛苦且容易出错。

怎么处理这个?

编辑:

查看相关问题侧边栏,我发现了另一个问题,它明确表示Dispose()无论如何应该由对象的终结器调用。因此,即使您从未自己调用它,它最终也应该会发生,这意味着如果您不使用它就不会发生内存泄漏using(我想这是我一直担心的问题)。唯一需要注意的是,垃圾收集器不知道对象作为非托管的东西持有多少额外的内存,因此它无法准确知道通过收集对象将释放多少内存。这将导致垃圾收集器的性能不如通常理想。

简而言之,如果我错过了一个using. 我只是希望某些东西至少会产生一个警告。

(题外话:为什么链接到另一个问题没有特殊的降价?)

编辑:

好吧,好吧,别吵了。这是超级骗子的全能戏剧花栗鼠级别,重要的是要打电话Dispose(),否则我们都会

现在。鉴于此,为什么这么容易——见鬼,为什么甚至允许——做错事?你必须不遗余力地做正确的事。像其他所有事情一样这样做会导致世界末日(显然)。封装这么多,是吧?

[离开,厌恶]

0 投票
1 回答
616 浏览

idisposable - NDepend CQL 查询缺少 IDisposable 实现

我意识到这个问题正在寻找的查询不足以找到 IDisposable 实现的每一个小问题,但每一个早期警告都很重要,所以我会尽我所能。

我想知道是否有人为 NDepend 提出了一个 CQL 查询,该查询将列出所有未实现 IDisposable 但具有一个或多个字段的类。一个类可能会通过错误(即有人忘记检查 IDisposable 实现的字段类型)或通过代码演变(即在某个字段中使用的类在某处获得 IDisposable 附加到以后的日期,所有用法都没有更新)。

查找所有未实现 IDisposable 的类的简单查询是:

但是,这当然不会检查该类是否应该为上述规则实现 IDisposable。

有没有人有这样的疑问?我仍然在掌握 CQL,所以这部分让我望而却步。

0 投票
1 回答
5084 浏览

.net - 您如何在托管 C++ 中处理 IDisposable?

我正在尝试在托管 C++(.NET 2.0)中处理 IDisposable 对象(FileStream^ fs)并收到错误消息

Dispose' : 不是 'System::IO::FileStream 的成员

它说我应该调用析构函数。会打电话

调用 FileStream 对象的 dispose 方法?为什么我不能调用 Dispose?

0 投票
2 回答
11124 浏览

c# - 未注册的事件处理程序导致内存泄漏

我正在维护一个存在内存泄漏的 Web 应用程序。

根据我使用 Red Gate ANTS 内存分析器的调查,我很确定内存泄漏是由业务层中的事件处理程序引起的。

有一个集合在添加的每个项目上注册一个事件处理程序,以便在项目的日期更改时集合可以重新排序。看来这个事件处理程序是罪魁祸首。

此应用程序的业务层相当复杂,因此将集合及其项保存在内存中会拖累一堆其他对象。

我在集合上实现了 IDisposable 并删除了 Dispose 方法中的事件处理程序:

但是,实现 IDisposable 并没有帮助,因为我无法在 using 或 try/catch 块中包装对集合的所有引用。此集合由我无法控制的应用程序部分使用。

如何清除这些事件处理程序以解决此内存泄漏?

0 投票
3 回答
1096 浏览

.net - IDisposable Winform

在 Winform 上实现 IDisposable 的最佳实践是什么?

  • 我有一个扩展 System.Windows.Forms.Form 的对话框
  • 生成的 Designer.cs 已经包含虚拟 Dispose(bool) 方法的实现
  • 我的表单手动添加了一个实现 IDisposable 的字段

理想情况下,我将能够在生成的代码中挂接到 Dispos(bool) 覆盖以处置手动添加的 IDisposable 对象。关于如何正确执行此操作的任何建议?

谢谢。

斯科特

0 投票
9 回答
19112 浏览

.net - 使用 IDisposable 取消订阅事件

我有一个处理来自 WinForms 控件的事件的类。根据用户正在做的事情,我正在推迟该类的一个实例并创建一个新实例来处理相同的事件。我需要先从事件中取消订阅旧实例 - 很简单。如果可能的话,我想以非专有的方式来做这件事,这似乎是 IDisposable 的工作。但是,大多数文档仅在使用非托管资源时才建议使用 IDisposable,这在此处不适用。

如果我实现 IDisposable 并取消订阅 Dispose() 中的事件,我是否会歪曲它的意图?我应该提供一个 Unsubscribe() 函数并调用它吗?


编辑:这是一些显示我在做什么的虚拟代码(使用 IDisposable)。我的实际实现与一些专有数据绑定有关(长话短说)。

在实际代码中,“EventListener”类涉及的比较多,每个实例都具有唯一意义。我在一个集合中使用它们,并在用户单击时创建/销毁它们。


结论

我接受gbjbaanb 的回答,至少现在是这样。我觉得使用熟悉的界面的好处超过了在不涉及非托管代码的情况下使用它的任何可能的缺点(这个对象的用户怎么会知道这一点?)。

如果有人不同意 - 请发布/评论/编辑。如果可以针对 IDisposable 提出更好的论据,那么我将更改已接受的答案。

0 投票
5 回答
2109 浏览

c# - 实现 IDisposable 接口的目的是什么?

实现 IDisposable 接口的目的是什么?我已经看到一些实现它的类,但我不明白为什么。

0 投票
3 回答
4436 浏览

.net - 最佳实践:在组件上覆盖 OnDispose(bool disposing) 与 Disposed 事件

在 .Net 中,Component该类公开了一个Disposed事件。它还提供了一个受保护的成员OnDispose(bool disposing)

扩展自定义组件的最佳实践是什么Component?覆盖OnDispose(bool)或附加事件处理程序到Disposed构造?

我的感觉是,一个人应该超越OnDispose(bool)和封印班级。

想法?

0 投票
2 回答
2544 浏览

c# - 在 using 语句中 LINQ 如何延迟执行

想象一下,我有以下内容:

根据文档,linq 执行将推迟到我实际枚举结果,该结果出现在 foreach 的行中。然而 using 语句应该强制在调用 MyFunct() 结束时可靠地收集对象。

实际发生了什么,处置器何时运行和/或结果运行?

我唯一能想到的是延迟执行是在编译时计算的,所以编译器将实际调用移动到 foreach 的第一行,导致 using 正确执行,但直到 foreach 行才运行?有大神可以帮忙吗?

编辑:注意:这段代码确实有效,我只是不明白如何。

我做了一些阅读,并在我的代码中意识到我调用了 ToList() 扩展方法,该方法当然会枚举结果。勾选答案的行为对于回答的实际问题是完全正确的。

很抱歉有任何混淆。