问题标签 [dispose]

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 投票
20 回答
80180 浏览

.net - 如何在.net中配置一个类?

.NET 垃圾收集器最终会释放内存,但如果您想立即恢复内存怎么办?你需要在类中使用什么代码MyClass来调用

并通过变量和对象释放所有使用的空间MyClass

0 投票
11 回答
547 浏览

c# - 强制执行所需的函数调用

我在 C# 中有一个“状态”类,使用如下:

你明白了。MyFunction 的所有调用者都应该检查返回的状态:

然而,懒惰的呼叫者可以忽略状态。

或者

有可能使这成为不可能吗?例如抛出异常

一般来说:是否可以编写一个必须调用某个函数的 C# 类?

在 Status 类的 C++ 版本中,我可以对析构函数中的一些私有 bool bIsChecked 编写测试,并在有人不检查此实例时敲响一些铃声。

C# 中的等效选项是什么?我在某处读到“你不想在你的 C# 类中使用析构函数”

IDisposable 接口的 Dispose 方法是一个选项吗?

在这种情况下,没有可释放的非托管资源。此外,还不确定GC何时释放该对象。当它最终被处置时,是否仍然可以知道您在何时何地忽略了该特定状态实例?“using”关键字确实有帮助,但同样,懒惰的调用者不需要它。

0 投票
9 回答
34628 浏览

.net - 垃圾收集器会为我调用 IDisposable.Dispose 吗?

.NET IDisposable 模式 意味着,如果您编写终结器并实现 IDisposable,则终结器需要显式调用 Dispose。这是合乎逻辑的,也是我在极少数需要终结器的情况下一直做的事情。

但是,如果我这样做会发生什么:

并且不要实现终结器或任何东西。框架会为我调用 Dispose 方法吗?

是的,我意识到这听起来很愚蠢,所有逻辑都暗示它不会,但我的脑后总是有两件事让我不确定。

  1. 几年前有人告诉我,它实际上会这样做,而且那个人在“了解他们的东西”方面有着非常可靠的记录。

  2. 编译器/框架会根据您实现的接口(例如:foreach、扩展方法、基于属性的序列化等)执行其他“魔术”操作,因此这也可能是“魔术”是有道理的。

虽然我已经阅读了很多关于它的东西,并且暗示了很多东西,但我从来没有能够找到一个明确的“是”或“否”的答案来回答这个问题。

0 投票
7 回答
2046 浏览

c# - 如何在 C# 中执行 C++ 风格的析构函数?

我有一个带有Dispose函数的 C# 类IDisposable。它旨在在using块内使用,因此可以立即释放它处理的昂贵资源。

问题是在调用之前抛出异常时发生了错误Dispose,而程序员忽略了使用usingor finally

在 C++ 中,我从来不用担心这个。对类的析构函数的调用将自动插入到对象作用域的末尾。避免这种情况发生的唯一方法是使用 new 运算符并将对象保存在指针后面,但这需要程序员额外的工作不是他们会偶然做的事情,比如忘记使用using.

有什么方法using可以在 C# 中自动使用块?

非常感谢。

更新:

我想解释一下为什么我不接受终结者的答案。这些答案本身在技术上是正确的,但它们不是 C++ 风格的析构函数。

这是我发现的错误,简化为基本要素...

使用FXCop是一个很好的建议,但如果这是我唯一的答案,我的问题将不得不成为 C# 人的请求,或者使用 C++。二十个嵌套 using 语句有人吗?

0 投票
4 回答
43826 浏览

.net - SqlCommand.Dispose 是否关闭连接?

我可以有效地使用这种方法吗?

我担心的是:SqlCommand 的 Dispose 方法(退出 using 块时调用)是否会关闭底层 SqlConnection 对象?

0 投票
4 回答
11719 浏览

vb.net - VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?

在 Visual Studio 中,当我键入“ Implements IDisposable”行时,IDE 会自动添加:

  • 成员disposedValue变量
  • 一种Sub Dispose() Implements IDisposable.Dispose
  • 一种Sub Dispose(ByVal disposing As Boolean)

应该不理Dispose()会,清理代码应该放在Dispose(disposing).

然而Dispose Finalize Pattern说你也应该重写Sub Finalize()call Dispose(False)。为什么 IDE 也不添加这个?我必须自己添加它,还是以某种方式隐式调用它?

编辑:知道为什么 IDE 会自动添加 80% 的所需内容但忽略 Finalize 方法吗?这种功能的全部意义不在于帮助您不要忘记这些事情吗?

EDIT2:谢谢大家的出色回答,现在这很有意义!

0 投票
1 回答
2890 浏览

c# - ThreadStatic 对象的确定性处理

ThreadStatic 属性将静态变量声明为每个线程唯一。您知道正确处理此类变量的简单模式吗?

我们在 ThreadStatic 之前使用的是 ThreadContextManager。每个线程都被分配了一个 ThreadContext,它保留了所有线程特定的信息。我们产生了一些线程并让它们工作。然后,当它们都完成后,我们释放了 ThreadContentManager,如果它们是 IDisposable,它会依次释放所有上下文。

我看不到将这种模式转换为 ThreadStatic 对象的直接方法。这些对象最终会被处理掉,因为线程死掉了,所以没有任何东西引用它们。但是,我们尽可能倾向于确定性处置。

更新

我并没有真正直接控制线程——我使用的是 Microsoft CCR,它有一个执行任务的 ThreadPool。完成所有任务后,我将处理 Dispatcher(它包含线程池)。问题是 - 我没有机会“在线程的主要功能结束时”做任何事情 - 所以我不能在线程运行结束时手动处理事情。我可以以某种方式从线程外部访问线程的静态对象吗?

0 投票
6 回答
3740 浏览

c# - 终结器和处置

我有一个名为的类BackgroundWorker,它有一个不断运行的线程。要关闭这个线程,一个名为stopto 的实例变量需要是true.

为了确保在使用完类时释放线程,我添加IDisposable了一个调用Dispose(). 假设stop = true确实会导致该线程退出,那么这个 sippet 是否正确?Dispose从终结器调用很好,对吗?

Dispose如果object继承,终结器应该总是调用IDisposable,对吗?

0 投票
8 回答
55129 浏览

c# - 如何将 Dispose 功能添加到 C# UserControl?

我有一个实现 UserControl 的类。在 .NET 2005 中,会在 MyClass.Designer.cs 部分类文件中自动创建一个 Dispose 方法,如下所示:

如果我想添加自己的 Dispose 功能,我应该把它放在哪里?由于生成了此文件,因此我不想在此处添加代码并冒着被吹走的风险。

0 投票
8 回答
47355 浏览

c# - 如何判断 IDisposable 对象引用是否已释放?

有没有一种方法或其他一些轻量级的方法来检查引用是否是对已处理对象的引用?

PS - 这只是一个好奇(睡得好,不是在生产代码中)。是的,我知道我可以ObjectDisposedException在尝试访问对象的成员时捕捉到。