问题标签 [disposable]
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.
c# - 不显式调用时是否会被 GC 自动调用 dispose?
我有 DisposableObject 是 IDisposable。我知道它应该被包装到 using 或 dispose 被显式调用。
但我曾与一些同事争论过这个逻辑。您认为 GC 会在某些时候自动调用“未处理”的 Dispose 方法吗?
感谢你的回答。
c# - 返回一个链接到一次性对象的对象
在下面的代码中,处置principalCtx
会影响userPrin
吗?
principalCtx
仅用于查找用户还是以某种方式与userPrin
对象保持链接?
c# - 删除老式的终结器
在一个将近 10 年的老系统中,我已经实现了几个IDisposable
实现。回到过去,当我还年轻而且还很愚蠢的时候,趋势是也实现一个终结器:
最后,在将近十年之后,这让我们感到困惑——Dispose 方法在从 finalizer 调用时抛出了一个异常,并且该进程在没有任何警告的情况下意外死亡。
我想删除所有终结器,只保留Dispose
将处理资源的方法。有什么理由保留终结者吗?没有一个对象使用非托管资源,所以我很确定我不会得到资源泄漏。正确的?
c# - 处置 x 关闭
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
那么,为什么关于“close x dispose”甚至 MSDN 模式的几个答案都显示 Close 方法调用 Dispose ?
memory - 反序列化 Revit API
这是我第一次接触序列化...事实上我正在通过 C# 开发 Autodesk Revit。
客观的:
我需要将数据记录到 HDD 上的新文件中,以便可以通过 Revit 从另一台计算机打开该文件。
程序:
- 处理所有必需的数据。来自 Main 类。
- 实例化这些数据并将其传递给 Serializable 类。
- 保存以归档来自主类的数据。
- 释放流并将可序列化类设置为空。
- 反序列化。
- 根据获取的数据在 revit 上做一些事情。
问题 - 程序完美运行,没有错误,一切正常。- 再次按下按钮以重新运行在反序列化时失败的程序,并显示此错误代码
[A]Cons_Coor.ThrDviewData 无法转换为 [B]Cons_Coor.ThrDviewData。类型 A 源自位置 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_224454_4113 的上下文 'LoadNeither' 中的 'Cons_Coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' \Cons_Coor.dll'。类型 B 源自位置 'C:\Users\mostafa\AppData\Local\Temp\RevitAddins\Cons_Coor-Executing-20140820_230011_0316 的上下文 'LoadNeither' 中的 'Cons_Coor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' \Cons_Coor.dll'。在 Cons_Coor.dll 中发生了“System.NullReferenceException”类型的第一次机会异常
主类:
可序列化类
所以有什么提示吗?
c# - C# Disposable Objects 未处置但使用的内存未增加
我创建了这个简单的 C# 程序,期望它抛出 OutOfMemoryException。问题是它可以在不使用我所有笔记本电脑内存的情况下完美运行。为什么?我怎样才能让它泄漏所有的内存?
java - 如何在 Java 中实现将某些引用显式标记为“不需要”?
在我看来,我发现了一种情况,标准的垃圾收集算法不能很好地使用。
假设我有一些 object A
,它在构造时将自身添加为来自 object 的事件的事件侦听器B
。由于对象具有将自身添加为侦听器所需的所有数据,因此它也具有将自身从侦听器中删除的数据。
不幸的是,删除过程不能由 启动GC
,因为对象将在侦听器列表中引用,直到显式删除。
因此,这意味着任何一个对象都不应该将自己添加为侦听器,或者应该有一种方法可以将某些引用标记为不重要。在后一种情况下GC
,即使存在对对象的一些引用,也会启动垃圾收集——如果它们只是“不重要”的情况。
显然,程序员应该有义务在诸如dispose
or之类的方法中清除所有不重要的引用finalize
。
我知道这种直接实施将是一种安全漂白。例如,如果程序员违反了处置契约,垃圾收集将提供不正确的引用。
所以,问题是:是否有一些库或模式来实现这种关系?
c# - 为什么 Dispose() 不应该释放托管资源而终结器?
我们都知道 System.IDisposable 模式。它被描述了无数次,也在 StackOverflow 上:
Disposable 模式建议我应该只在我的对象被处置时才处置托管资源,而不是在 finalize 期间
您可以看到发生这种情况是因为建议使用以下代码:
我知道只要我的类有一个实现 System.IDisposable 的(私有)成员,我的类就应该实现 System.IDisposable。如果布尔处理为真,则 Dispose(bool) 应调用私有成员的 Dispose()。
如果在 finalize 期间调用 Dispose 为什么会出现问题?那么,如果在 finalize 期间调用了以下 Dispose,为什么会出现问题呢?
c# - 这将是 IDisposable 的有效基类吗
IDisposable 模式的实现成本很高。在开始实际处理资源之前,我已经计算了 17 行代码。
Eric Lippert 最近写了一篇博客文章,提出了一个有趣的观点:任何时候运行终结器,它都是一个错误。我认为这很有意义。如果始终遵循 IDisposable 模式,则应始终抑制 Finalizer。它永远没有机会运行。如果我们接受终结器运行是一个错误,那么有一个指导方针来强制开发人员从以下抽象类派生并禁止直接实现 IDisposable 接口是否有意义。
好处很明显:
- 实现 dispose 变得容易且无错误,如下所示:
报告了未处理的对象
始终遵循一次性模式
但是,这样的指导方针有什么问题吗?
一个可能的问题是所有一次性对象都将定义一个终结器。但是由于终结器总是被抑制,所以不应该有任何性能损失。
你觉得呢?你有没有什么想法?
c# - 将 IDisposable(Disposable 模式)实现为服务(类成员)
Disposable 模式是基于每个类重新实现的模式。所以,我一直在寻找一种方法来概括它。几年前我遇到的问题是,即使你将它实现为类本身,你也不能从你的 Disposable 实现和另一个类中派生一个对象(C# 不支持多继承)。
问题是,您如何制定一种通用的方式来实现 Disposable 模式,这样您就不需要为每个实现 IDisposable 的类显式地编写它?
这是 Visual Studio (VS 2015) 为您生成的标准 Disposable 模式。