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

.net - IDisposable 接口如何工作?

我知道它用于释放非托管资源,但是,我对何时Dispose实际调用感到困惑。我知道它在块的末尾被using调用,但是当对象被垃圾收集时它也会被调用吗?

0 投票
5 回答
969 浏览

wpf - ViewModel 如何知道服务中的数据何时更新?

在我的应用程序中,我有几个 ViewModel 有一个服务(存储库、DAO 等),我们称它为WidgetService 并注入它们。

假设这些 ViewModel 之一是所有用户小部件的列表。另一个可能是用于编辑/创建其中一个小部件的 ViewModel。

用户可以在WidgetListViewModel支持的WidgetListView中查看小部件列表,然后单击按钮添加新小部件。为了创建这个新的 Widget,创建一个CreateWidgetViewModel并注入到一些 UserControl/Window 的 DataContext 中,因此,通过 DataTemplates 在 CreateWidgetView 中显示CreateWidgetViewModel魔力。此外,CreateWidgetViewModel的更新不一定发生在WidgetListViewModel的范围内。

WidgetListViewModel被注入 WidgetService 的实例CreateWidgetViewModel被注入了同一个WidgetService实例。

现在,当用户在CreateWidgetView中单击保存时,将调用WidgetService上的Save方法,并且小部件将被持久化。现在需要通知WidgetListViewModel有一个新的 Widget 要显示!

长时间的积累导致了这个问题:我如何让WidgetListViewModel知道它需要显示新的 Widget?

我看过一个视频,其中一个来自 Microsoft 的人使用 ViewModel 订阅的服务上的事件来做这种事情。然而,这样做的缺点是,如果服务比视图模型寿命更长,那么视图模型将不会被 GC 处理,直到服务被 GC 处理。我可以将 IDisposable 添加到 ViewModel。但是,当 ViewModel 仅通过 DataTemplates 在 UI 中表示时,何时/如何调用 Dispose?

有人对此有什么建议吗?

为了澄清,我想说我对 MVVM 的解释最接近 Josh Smith 的解释。至少在我的 MVVM 架构上与 Crack.Net 源代码中的架构非常接近。

0 投票
4 回答
4482 浏览

c# - 我的代码是否正确清理了它的列表?

我有一个执行 PDF 文件操作的第三方组件。每当我需要执行操作时,我都会从文档存储(数据库、SharePoint、文件系统等)中检索 PDF 文档。为了使事情有点一致,我将 PDF 文档作为byte[].

这个第 3 方组件需要一个MemoryStream[]( MemoryStreamarray) 作为我需要使用的主要方法之一的参数。

我正在尝试将此功能包装在我自己的组件中,以便我可以将此功能用于我的应用程序中的许多区域。我基本上提出了以下几点:

我的“包装器”的调用代码如下所示:

关于上面的几个问题:

  1. 方法中的using子句是AddFileToManipulate()多余的和不必要的吗?
  2. Dispose()我在我的对象的方法中清理东西好吗?
  3. 这是“可接受的”用法MemoryStream吗?我预计内存中不会同时有很多文件......总共可能有 1-10 个 PDF 页,每页大约 200KB。设计为在支持 ASP.NET 站点的服务器上运行的应用程序。
  4. 有什么意见/建议吗?

感谢代码审查 :)

0 投票
7 回答
8552 浏览

c# - 您如何防止 IDisposable 传播到您的所有班级?

从这些简单的类开始......

假设我有一组简单的类,如下所示:

ABus有 a Driver, theDriver有两个Shoes,每个Shoe都有 a Shoelace。都非常傻。

将 IDisposable 对象添加到 Shoelace

后来我决定一些操作Shoelace可以是多线程的,所以我添加了一个EventWaitHandle用于线程通信的线程。所以Shoelace现在看起来像这样:

在鞋带上实现 IDisposable

但现在微软的 FxCop会抱怨:“在 'Shoelace' 上实现 IDisposable,因为它会创建以下 IDisposable 类型的成员:'EventWaitHandle'。”

好的,我实现IDisposableShoelace,我整洁的小班变成了可怕的一团糟:

或者(正如评论者所指出的)因为Shoelace它本身没有非托管资源,我可以使用更简单的 dispose 实现而不需要Dispose(bool)and 析构函数:

惊恐地看着 IDisposable 传播

没错,就是这么固定的。但是现在 FxCop 会抱怨Shoe创建了一个Shoelace,所以也Shoe必须IDisposable如此。

并且Driver创造必须Shoe如此。并创造必须如此等等。DriverIDisposableBusDriverBusIDisposable

突然间Shoelace,我BusShoelace.

问题

您如何防止IDisposable.

0 投票
7 回答
56097 浏览

c# - 在 using 块的中间返回

就像是:

我认为这不是退货声明的合适位置,是吗?

0 投票
7 回答
1040 浏览

c# - 关于using语句的一些高级问题

我知道这里有很多关于如何使用 using 语句和调用 Dispose() 方法的线程。我已经阅读了这些主题的大部分内容。

如果我调用 Dispose(),它会调用 Close() 吗?

如果我想使用一个对象(比如 SqlDataReader),然后在另一个代码块中再次使用它,我不应该调用 Dispose() 吗?这也意味着省略 using 语句。

此外,为了澄清,如果 FileStream 正在包装 StreamWriter 并且我在 FileStream 上调用 dispose,这将在 StreamWriter 上调用 Flush()、Close() 和 Dispose()(取决于 Dispose() 是否调用 Close()),对?同样,如果我在 FileStream 上调用 Close,这只会在 FileStream 上调用 Flush() 和 Close()。

检查 IL 是回答这些关于幕后发生的事情的好方法吗?

0 投票
3 回答
9861 浏览

c# - 在 IDisposable 类层次结构中正确处理 ObjectDisposedException

在正确实现 IDisposable 时,包括框架指南在内的大多数实现都建议包含一个private bool disposed;成员,以便安全地允许多次调用Dispose(),并在适当时Dispose(bool)抛出ObjectDisposedException 。

这适用于单个类。但是,当您从一次性资源中进行子类化,并且子类包含自己的本机资源和独特的方法时,事情会变得有些棘手。大多数示例显示如何Dipose(bool disposing)正确覆盖,但不要超出处理ObjectDisposedException

在这种情况下,我有两个问题。


第一的:

子类和基类都需要能够跟踪处置状态。我知道有几个主要选项 -

  • 1) 声明 private bool 已处理;在两个班级。每个类都跟踪自己的 this.disposed,并根据需要抛出。

  • 2) 使用受保护的 bool Disposed { get; 私人套装;} 而不是一个字段。这将让子类检查处置状态。

  • 3) 提供一些受保护的辅助方法来检查已释放状态,如果对象已释放,则通过反射拉出当前类型名称来抛出。

我看到的每个选项的优点和缺点是:

  • 1)这对我来说“闻起来”,因为它包含重复的布尔值,但似乎工作正常。在子类化其他代码时,我经常使用它。

  • 2)这取出了重复的布尔值,但不是设计指南书籍的编写方式,等等。不过,这是我通常使用的,因为它保持它的单点状态。

  • 3)这对我来说似乎是最干净的选择,但没有出现在标准指南中。与班级用户的其他方法相比,这种方法的期望可能会少一些。

我曾经尝试过使用所有这三种方法。我想知道这三种方法的优缺点,以及任何其他更清洁、更好的处理方法的想法。在处理这个问题时你会做出什么选择,为什么?


第二:

抛出时ObjectDisposedException,你用什么来做 name 参数?我知道“典型”的方法调用是:

p>

Microsoft 员工在此页面上有一条评论,建议实现具体类的全名是适当的用法。

在上面的第三个选项中,这将是唯一有意义的选择。但是,如果该类自己实现了抛出,您可能会返回定义所调用方法的类的名称。(即:基类可以返回基类的名称,而不是具体的子类)

我认为这不是一个好主意 - 但我在其他人编写的一些代码上遇到了这个问题。返回实现方法的类的名称有优点还是缺点?

0 投票
3 回答
2994 浏览

c# - Dispose 在用户控件上,真的是要编辑 .designer.cs 文件吗?

对于具有必须释放的内部数据结构的用户控件,将该代码添加到 .designer.cs 文件中的 Dispose 方法的正确位置是否正确,或者是否有一个事件或我们打算使用的东西?

编辑:这是一个 winforms 用户控件。

0 投票
10 回答
7402 浏览

c# - 谁处置 IDisposable 公共财产?

如果我有一个SomeDisposableObject实现的类IDisposable

我还有另一个名为 的类AContainer,它有一个SomeDisposableObject作为公共属性的实例:

然后FxCop会坚持说AContainer也是造的IDisposable

这很好,但我看不到如何安全地调用m_someObject.Dispose()from AContainer.Dispose(),因为另一个类可能仍然有对该m_someObject实例的引用。

避免这种情况的最佳方法是什么?

(假设其他代码依赖于AContainer.SomeObject始终具有非空值,因此简单地将实例的创建移到外部AContainer不是一种选择)

编辑:我将用一些例子进行扩展,因为我认为一些评论者错过了这个问题。如果我只是实现一个调用 m_someObject.Dispose() 的方法,那么我会遇到以下情况Dispose()AContainer

这有帮助吗?

0 投票
0 回答
2908 浏览

c# - 如果我在 using 语句中返回,对象是否仍然被释放?

在使用块中间返回的错误

我认为问题标题相当明显,因此如果返回 true,则考虑以下代码是否会处理 SecurityDisabler?