有终结器但没有 IDisposable 的单例

2023-12-20

这是我从“CLR via C#”、“Effective C#”和其他资源中对 IDisposable 和终结器的理解:

  • IDisposable 用于确定性地清理托管和非托管资源。
  • 负责非托管资源(例如文件句柄)的类应该实现 IDisposable 并提供终结器,以保证即使客户端代码没有在实例上调用 Dispose(),它们也会被清理。
  • 仅负责托管资源的类永远不应该实现终结器。
  • 如果您有终结器,那么您必须实现 IDisposable(这允许客户端代码执行正确的操作并调用 Dispose(),而终结器可以防止在忘记时泄漏资源)。

虽然我理解并同意上述所有内容的原因,但在一种情况下,我认为打破这些规则是有意义的:负责非托管资源的单例类(例如提供对特定文件的单点访问) )。

我相信在单例上使用 Dispose() 方法总是错误的,因为单例实例应该在应用程序的生命周期内存在,如果任何客户端代码调用 Dispose() 那么你就会被塞满。但是,您需要一个终结器,以便在卸载应用程序时终结器可以清理非托管资源。

因此,在我看来,拥有一个带有未实现 IDisposable 的终结器的单例类是一件合理的事情,但这种类型的设计与我所理解的最佳实践背道而驰。

这是一个合理的做法吗?如果不,为什么不呢?更好的选择是什么?


我首先要提到的是,面向对象的设计模式及其后果并不总是影响每个语言决策,即使在面向对象的语言中也是如此。您当然可以找到用一种语言(Smalltalk)而不是另一种语言(C++)更容易实现的经典设计模式。

话虽如此,我不确定我是否同意单例实例只能在应用程序结束时处理的前提。我读过的设计模式描述中没有任何内容辛格尔顿 http://www.dofactory.com/Patterns/PatternSingleton.aspx (or 设计模式:可重用的面向对象软件的元素 https://rads.stackoverflow.com/amzn/click/com/0201633612)将此作为此模式的属性提及。单例应该确保该类在任何一个时刻都只存在一个实例;这并不意味着只要应用程序存在它就必须存在。

我有一种感觉,在实践中,应用程序生命周期的大部分时间里确实存在许多单例。但是,请考虑一个使用 TCP 连接与服务器通信但也可以以断开连接模式存在的应用程序。连接时,您需要一个单例来维护连接信息和连接状态。一旦断开连接,您可能希望保留相同的单例 - 或者您可以丢弃该单例。虽然有些人可能会认为保留单例更有意义(我什至可能是其中之一),但设计模式本身并没有什么可以阻止您处理它 - 如果重新建立连接,则可以实例化单例再说一次,因为当时不存在它的实例。

换句话说,您可以创建单例具有 IDisposable 是合乎逻辑的场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有终结器但没有 IDisposable 的单例 的相关文章

  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 更改magento中的愿望清单网址[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个特别的要求 是否可以将整个愿
  • 在 Clojure 中实现 Java 泛型接口

    我正在尝试使用 selenium2 webdriver 项目来掌握 clojure 的窍门网络驱动程序 clj http github com mikitebeka webdriver cljwebdriver 的包装器 然而 由于网络界面
  • Android 中的上下文是如何创建的? ContextThemeWrapper 的目的是什么?

    我正在帮助整理此页面 什么是上下文 https github com codepath android guides wiki Using Context 为了帮助说明组件如何与Context 我通过查看框架源代码创建了这个图 经过一番研究
  • 使用标签或 的灯箱

    是否有任何灯箱实现允许使用 a href a fancybox net 只需很少的工作即可实现这一目标 a href data image each function this fancybox content img attr src t
  • TypingError:在 nopython 模式管道中失败(步骤:nopython 前端)

    我正在尝试使用 numba jit 编写我的第一个函数 我有一个 pandas 数据帧 我需要迭代它并找到每个 350 个点的均方根 因为 python 的 for 循环非常慢 我决定尝试 numba jit 代码是 jit nopytho
  • 在 Python 中使用生成器进行广度优先树遍历

    我正在 David Beazly 的优秀 Python Cookbook 文本中研究如何在 Python 中使用生成器 以下代码配方非常优雅地使用生成器定义了深度优先树遍历 example py Example of depth first
  • 从地图 API 获取建筑物的高度

    是否有任何公共地图 API 谷歌 微软 openstreet 可以返回某些点的屋顶高度 想象一下 您请求一些地址 API 返回坐标 一些信息和建筑物的高度 如果有 OpenStreetMap 有一个身高标签 http wiki openst
  • 如何向块添加额外的参数

    有一个很酷的method https github com MailCore MailCore blob master Source CTBareAttachment h下载附件并接受块作为参数以返回下载进度 CTCoreAttachmen
  • 如何在没有角色的情况下使用 ASP.NET Core Identity?

    在asp net core 2中实现身份而不实现角色是否可行 我尝试执行以下操作 services AddIdentityCore
  • Webpack - 使用 CopyWebpackPlugin 将文件从源复制到公共

    我有一个正在使用 Webpack 的应用程序 在此应用程序中 我需要从我的各个目录中复制一些静态 html 文件source目录到同一层次结构public目录 为了尝试做到这一点 我正在使用复制Webpack插件 https github
  • C++ 编译时一个类的子类列表

    我正在考虑如何创建从模板基类派生的所有类的列表 首先我想要一个模板基类 template
  • Cygwin64 上的 Python 2.7.5:请求安装失败

    我们的项目主要是基于 J2EE 的开发 并使用 Python 编写的自动功能和集成测试 测试环境是Linux 但开发人员使用Windows 7 64位 我们希望也能够在开发人员机器上执行功能测试 在提交之前 不幸的是pexpect wind
  • JavaScript 变量的生命周期

    JavaScript 中用 var 声明的变量的生命周期是多少 我确信 这绝对不符合预期 JavaScript 如何以及何时垃圾收集变量a Since a是内部函数闭包的一部分 理想情况下它永远不应该被垃圾收集 因为内部函数fun 可以作为
  • .NET MAUI 中的页眉和页脚

    我想做与这个问题相同的事情 但是对于 NET MAUI 所有 WPF 窗口中的页眉和页脚相同 https stackoverflow com questions 20113405 same header footer in all wpf
  • 如何使用WebRTC停止屏幕共享?

    我在用着获取用户媒体 https developer mozilla org en US docs Web API Navigator getUserMedia访问屏幕共享 当用户单击停止按钮时 我想停止屏幕共享 根据媒体流API http
  • 如何在div上创建不均匀的圆角?

    我一直在尝试制作一个具有不均匀圆边的 DIV 如下所示 我检查了一些解决方案 最接近的解决方案是使用 border radius 我用过 border bottom left radius 80 50px border bottom rig
  • 无法将 Intellij 与生成的源文件夹一起使用

    相关问题如何配置 IntelliJ IDEA 和 或 Maven 自动添加包含使用 jaxb2 maven plugin 生成的 Java 源代码的目录 https stackoverflow com questions 2644609 h
  • 在 gmail 中通过 PHP 登录时电子邮件尝试失败

    我需要用 PHP 发送电子邮件的帮助 我实际上正在尝试使用 PHP 邮件程序发送电子邮件 不知何故 某些邮件 ID 能够发送电子邮件 但其他一些电子邮件 ID 无法发送 我在 Gmail 中收到一封电子邮件 指出 登录尝试被阻止 有人可以帮
  • 需要 ANSI 92 递归 SQL 语句

    我目前正在将 SQL Server SQL 语句转换为其 ANSI 通用等效项 并且一直坚持使用WITH 语句的递归语句 为了集中讨论这个问题 我将问题简化如下 如果我有两张桌子 报告单位 col1 关键 col2 ParentReport
  • 有终结器但没有 IDisposable 的单例

    这是我从 CLR via C Effective C 和其他资源中对 IDisposable 和终结器的理解 IDisposable 用于确定性地清理托管和非托管资源 负责非托管资源 例如文件句柄 的类应该实现 IDisposable 并提