idisposable相关内容

在 C# 中使用 Finalize/Dispose 方法

C# 2008 我已经为此工作了一段时间,但我仍然对在代码中使用 finalize 和 dispose 方法感到困惑.我的问题如下: 我知道在处理非托管资源时我们只需要一个终结器.但是,如果有托管资源调用非托管资源,是否还需要实现终结器? 但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现 IDisposable 以允许该类的客户端使用“使用陈述'? 实 ..
发布时间:2022-01-31 15:34:32 C#/.NET

在 C# 编译器中输入鸭子

注意这不是关于如何在 C# 中实现或模拟鸭子类型的问题... 多年来,我的印象是某些 C# 语言特性依赖于语言本身定义的数据结构(在我看来,这总是一种奇怪的鸡与蛋的场景).例如,我的印象是 foreach 循环只能用于实现 IEnumerable 的类型. 从那以后我开始明白 C# 编译器使用鸭子类型来确定一个对象是否可以在 foreach 循环中使用,寻找 GetEnumerator ..
发布时间:2022-01-17 00:05:10 C#/.NET

为什么总是需要在具有 IDisposable 成员的对象上实现 IDisposable?

据我所知,如果你有一个类 A 有一个成员 m 是 IDisposable,A 应该实现 IDisposable 并且它应该在其中调用 m.Dispose() 是一个公认的规则. 我找不到令人满意的理由. 我理解如果你有非托管资源,你应该提供一个终结器以及 IDisposable 的规则,这样如果用户没有显式调用 Dispose,终结器仍然会在 GC 期间清理. 但是,有了该规则, ..
发布时间:2022-01-16 10:28:20 C#/.NET

包含实现 IDisposable 的项目的会话

在 ASP.NET 中,如果项目留在会话状态中,实现 IDisposable 但在会话到期时从未被应用程序专门删除和处置,将对 Dipose() 中的任何代码将执行的对象调用 Dispose? 解决方案 如果 IDisposable 模式是 正确实现,然后是的(即类的析构函数将负责处理对象).我不相信 ASP.NET 会话管理器对在实现 IDisposable 的类上显式调用 Dispos ..
发布时间:2022-01-16 10:25:51 C#/.NET

拥有一次性字段的类型应该是一次性的.如何解决这个警告?

我尝试在 VisualStudio 2012 中使用 Run Code Analysis 选项,结果我收到了警告 CA1001 拥有一次性字段的类型应该是一次性的在“DBConnectivity"上实现 IDisposable因为它创建了以下 IDisposable 类型的成员:“SqlConnection"、“SqlCommand". 我在 SO 中提到了一些问题,但我无法理解关于 IDis ..
发布时间:2022-01-16 10:23:31 C#/.NET

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

从这些简单的类开始... 假设我有这样一组简单的类: 类总线{驱动程序 busDriver = new Driver();}类驱动程序{鞋 [] 鞋 = { 新鞋(),新鞋() };}类鞋{鞋带花边 = 新鞋带();}类鞋带{布尔绑定=假;} 一个Bus有一个Driver,Driver有两个Shoe,每个Shoe 有一个 鞋带.都非常傻. 将 IDisposable 对象添加到鞋带 ..
发布时间:2022-01-16 09:58:52 C#/.NET

应该“处置"仅用于包含非托管资源的类型?

我最近和一位同事讨论了 Dispose 的值和实现 IDisposable 的类型. 我认为为应该尽快清理的类型实现 IDisposable 是有价值的,即使没有要清理的非托管资源. 我的同事想法不同;如果您没有任何非托管资源,则无需实施 IDisposable,因为您的类型最终会被垃圾回收. 我的论点是,如果您有一个想要尽快关闭的 ADO.NET 连接,那么实现 IDispos ..
发布时间:2022-01-16 09:53:46 C#/.NET

Dispose() 方法中 GC.SuppressFinalize(this) 的目的是什么?

我有以下代码: public void Dispose(){if (_instance != null){_instance = null;//调用 GC.SupressFinalize 使这个对象脱离终结//排队并阻止该对象的终结代码//执行第二次.GC.SuppressFinalize(this);}} 虽然有一条注释解释了与 GC 相关的调用的目的,但我仍然不明白为什么会出现. 当 ..
发布时间:2022-01-16 09:52:03 C#/.NET

终结器和 IDisposable

基于文档(MSDN:链接),很明显,在实现终结器时应该使用 IDisposable 模式. 但是,如果您实现了 IDisposable(以便提供一种确定性的对象处置方式),并且您没有任何非托管资源需要清理,您是否需要实现终结器? 在我看来,如果该类只有托管资源并且您不调用 Dispose,则托管资源将自动被 GC 清理,因此无需实现终结器.我错了吗? 另外,如果我使用我的 Dis ..
发布时间:2022-01-16 09:49:30 C#/.NET

IDisposable 有什么用途?

如果 .NET 有垃圾回收功能,那为什么还要显式调用 IDisposable? 解决方案 垃圾回收是为了内存.您需要处理非内存资源 - 文件句柄、套接字、GDI+ 句柄、数据库连接等.这通常是 IDisposable 类型的基础,尽管实际的句柄可能在链中很长的参考资料.例如,您可以 Dispose 一个 XmlWriter 来处理它所引用的 StreamWriter,它会处理 FileSt ..
发布时间:2022-01-16 09:38:31 C#/.NET

我什么时候应该使用 GC.SuppressFinalize()?

在.NET中,什么情况下应该使用GC.SuppressFinalize()? 使用这种方法有什么好处? 解决方案 SuppressFinalize 只能由具有终结器的类调用.它通知垃圾收集器 (GC) this 对象已被完全清理. 当你有终结器时推荐的 IDisposable 模式是: 公共类 MyClass : IDisposable{私人布尔处置=假;protected ..
发布时间:2022-01-16 09:30:11 C#/.NET

Dispose,什么时候调用?

考虑以下代码: 命名空间 DisposeTest{使用系统;课堂节目{静态无效主要(字符串 [] 参数){Console.WriteLine("调用测试");测试();Console.WriteLine("调用测试完成");}静态无效测试(){DisposeImplementation di = new DisposeImplementation();}}内部类 DisposeImplement ..
发布时间:2022-01-16 09:30:05 C#/.NET

清理 Crystal Reports ReportDocument 对象使用的资源的最佳方法是什么?

我正在开发一个使用 Crystal Reports 进行报告的应用程序.它在 ReportDocument 对象中打开给定的报表,执行它需要执行的操作,然后关闭报表. 使用 (var report = OpenReport(reportSourceInfo)){//对报告做一些事情报告.关闭();} OpenReport 方法对源文件进行一些验证并返回一个打开的 ReportDocument ..
发布时间:2022-01-13 14:49:08 C#/.NET

何时或是否在调用 ReadAsStreamAsync 时处理 HttpResponseMessage?

我正在使用 System.Net.Http.HttpClient 进行一些客户端 HTTP 通信.我把所有的 HTTP 放在一个地方,从其余的代码中抽象出来.在一个实例中,我想将响应内容作为流读取,但流的使用者与 HTTP 通信发生的位置和流打开的位置完全隔离.在负责 HTTP 通信的地方,我处理了所有 HttpClient 的东西. 此单元测试将在 Assert.IsTrue(stream ..
发布时间:2022-01-07 19:54:14 C#/.NET

我应该为流对象调用 Close() 还是 Dispose()?

Stream、StreamReader、StreamWriter 等类实现了IDisposable 接口.这意味着,我们可以对这些类的对象调用 Dispose() 方法.他们还定义了一个名为 Close() 的 public 方法.现在这让我很困惑,一旦我完成了对象,我应该调用什么?如果我同时调用两者呢? 我当前的代码是这样的: using (Stream responseStream = ..
发布时间:2022-01-07 19:42:23 C#/.NET

ASP MVC:何时调用 IController Dispose()?

我正在对我的一个较大的 MVC 应用程序进行大规模重构/速度调整.它已经部署到生产中几个月了,我开始在连接池中等待连接超时.我已将问题追溯到未正确处理的连接. 有鉴于此,我已经对我的基本控制器进行了更改: 公共类 MyBaseController : 控制器{私有配置管理器配置管理器;//管理数据上下文.公共 MyBaseController(){configManager = new C ..