问题标签 [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.
c# - 这个 IDisposable 实现是否正确?
我永远记不起实现 IDisposable 接口的所有规则,所以我试图想出一个基类来处理所有这些并使 IDisposable 易于实现。我只是想听听你的意见,如果这个实现是好的,或者你是否看到了我可以改进的地方。这个基类的用户应该从它派生,然后实现两个抽象方法ReleaseManagedResources()
和ReleaseUnmanagedResources()
. 所以这里是代码:
.net - 无需处理的 XML 序列化
使用上面的代码可以完美地工作。但是,当我将其缩短为:
当我尝试在同一个测试中反序列化 users.xml 文件时出现以下异常:该进程无法访问文件“users.xml”,因为它正在被另一个进程使用。
原因似乎是 File.Create 方法返回一个打开的 FileStream,我无法关闭它,因为我没有保留它的引用。
我的坏,还是微软的?;-)
c# - 这对于使用 IDisposable 处理对象是否正确
我有一个实现 IDisposable 接口的类。我正在使用网络客户端使用 AsyncDownloadString 下载一些数据。
我想知道我是否在构造函数和 web 客户端的 using 语句中正确声明了我的事件处理程序?这是在 Dispose 方法中删除事件处理程序的正确方法吗?
否决这是使用 IDisposable 接口的正确方法吗?
c# - 在 C# 中使用 Finalize/Dispose 方法
C# 2008
我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑。我的问题如下:
我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?
但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现
IDisposable
允许该类的客户端使用“使用语句”?实现 IDisposable 只是为了让你的类的客户使用 using 语句是否可行?
/li>我在下面开发了这个简单的代码来演示 Finalize/dispose 的使用:
/li>
关于源代码的问题:
这里我没有添加终结器,通常终结器会被GC调用,终结器会调用Dispose。由于我没有终结器,我什么时候调用 Dispose 方法?是必须调用它的类的客户端吗?
因此,我在示例中的类称为 NoGateway,客户端可以像这样使用和处置该类:
执行到 using 块的末尾时会自动调用 Dispose 方法,还是客户端必须手动调用 dispose 方法?IE
/li>我在
WebClient
课堂上使用该NoGateway
课程。因为WebClient
实现了IDisposable
接口,这是否意味着WebClient
间接使用了非托管资源?是否有严格的规则来遵循这一点?我怎么知道一个类使用了非托管资源?
datatable - 我应该 Dispose() DataSet 和 DataTable 吗?
DataSet 和 DataTable 都实现了 IDisposable,因此,按照常规的最佳实践,我应该调用它们的 Dispose() 方法。
但是,从我目前所读到的内容来看,DataSet 和 DataTable 实际上没有任何非托管资源,因此 Dispose() 实际上并没有做太多事情。
另外,我不能只使用using(DataSet myDataSet...)
,因为 DataSet 有一个 DataTables 集合。
因此,为了安全起见,我需要遍历 myDataSet.Tables,处理每个 DataTable,然后处理 DataSet。
那么,在我的所有数据集和数据表上调用 Dispose() 是否值得?
附录:
对于那些认为应该处置 DataSet 的人:通常,处置模式是使用using
or try..finally
,因为您想保证 Dispose() 将被调用。
然而,这对于一个集合来说变得非常难看。例如,如果对 Dispose() 的调用之一引发异常,您会怎么做?你吞下它(这是“坏的”),以便你可以继续处理下一个元素吗?
或者,您是否建议我只调用 myDataSet.Dispose(),而忘记在 myDataSet.Tables 中处理 DataTables?
c# - 将 C# 的“使用”语句与自定义对象的函数一起使用,我是否需要实现 IDisposable?
我有一个这样的 sqlConnection 管理器类:
如果我使用带有“使用”语句的函数,例如:
using 语句是否会自动处理连接,因为conn.Connection()
返回一个 SqlConnection 对象?或者,我是否必须在 SqlConn 类上实现 IDisposable 和自定义 Dispose 方法?
这甚至是一个好方法吗?我正在使用遗留代码,我还不能使用 ORM,但是有没有办法简化这个现有的模式来管理/创建 SQL 连接?
.net - 应该使用 USING 语句的案例列表
“File 和 Font 是访问非托管资源(在本例中为文件句柄和设备上下文)的托管类型的示例。还有许多其他类型的非托管资源和封装它们的类库类型。所有此类类型都必须实现 IDisposable 接口。如一条规则,当你使用 IDisposable 对象时,你应该在 using 语句中声明和实例化它。” - MSDN
是否存在应使用 USING 语句的此类情况的列表(访问非托管资源(如 FILE 和 FONT,...)的托管类型?
c# - 考虑 C# 中的“一次性”关键字
您对如何在 .Net 中实现一次性对象有何看法?以及如何解决实现 IDisposable 类的重复性?
我觉得 IDisposable 类型不是他们应该成为的一等公民。太多的事情留给了开发商的摆布。
具体来说,我想知道是否应该在语言和工具中提供更好的支持,以确保正确实施和妥善处理一次性物品。
例如,在 C# 中,如果我的类需要实现一次性语义可以这样声明:
在这种情况下,编译器可以轻松生成 IDisposable 接口的实现。析构函数 ~MyDisposableThing 可以转换为应该释放托管资源的实际 Dispose 方法。
中间 C# 代码如下所示:
这将使代码更简洁,更少的样板代码处置代码,以及处置托管资源的一致方式。对于边缘情况和非托管资源,仍然支持手动实现 IDisposable。
确保正确处理实例是另一个挑战。考虑以下代码:
reader 变量永远不会超出方法的范围,但必须等待 GC 处理它。在这种情况下,编译器可能会引发 StreamReader 对象未显式释放的错误。此错误会提示开发人员将其包装在 using 语句中:
c# - 一次性
我正在尝试调整课程以适应刚刚完成的工作,但我无法解决问题。我的问题是如何识别句柄关闭 //CloseHandle(句柄)。我的问题是我无法调整以下代码。
c# - C#:IEnumerator在 using 语句中
我很想知道该SingleOrFallback
方法是如何在MoreLinq中实现的,并发现了一些我以前从未见过的东西:
为什么IEnumerator<T>
在using
声明中?foreach
这也是在使用on an时应该考虑的事情IEnumerable<T>
吗?
附带问题:这种方法究竟做了什么?每当源序列不包含一个项目时,它是否返回后备项目?