使用 IDisposable 取消订阅事件

2023-12-24

我有一个处理来自 WinForms 控件的事件的类。根据用户正在执行的操作,我引用该类的一个实例并创建一个新实例来处理同一事件。我需要首先从事件中取消订阅旧实例 - 很简单。如果可能的话,我想以非专有的方式执行此操作,这似乎是 IDisposable 的工作。但是,大多数文档仅在使用非托管资源时建议使用 IDisposable,但这并不适用于此。

如果我实现 IDisposable 并在 Dispose() 中取消订阅事件,我是否会歪曲其意图?我应该提供一个 Unsubscribe() 函数并调用它吗?


Edit:这是一些虚拟代码,显示了我正在做的事情(使用 IDisposable)。我的实际实现与一些专有数据绑定有关(长话短说)。

class EventListener : IDisposable
{
    private TextBox m_textBox;

    public EventListener(TextBox textBox)
    {
        m_textBox = textBox;
        textBox.TextChanged += new EventHandler(textBox_TextChanged);
    }

    void textBox_TextChanged(object sender, EventArgs e)
    {
        // do something
    }

    public void Dispose()
    {
        m_textBox.TextChanged -= new EventHandler(textBox_TextChanged);
    }
}

class MyClass
{
    EventListener m_eventListener = null;
    TextBox m_textBox = new TextBox();

    void SetEventListener()
    {
        if (m_eventListener != null) m_eventListener.Dispose();
        m_eventListener = new EventListener(m_textBox);
    }
}

在实际代码中,“EventListener”类涉及的比较多,并且每个实例都有唯一的意义。我在集合中使用它们,并在用户单击时创建/销毁它们。


结论

我接受gbjbaanb 的回答 https://stackoverflow.com/questions/452281/using-idisposable-to-unsubscribe-events#452321, 最起码到现在。我认为使用熟悉的界面的好处超过了在不涉及非托管代码的情况下使用它的任何可能的缺点(该对象的用户如何知道这一点?)。

如果有人不同意 - 请发布/评论/编辑。如果可以对 IDisposable 提出更好的论据,那么我将更改已接受的答案。


是的,去做吧。尽管有些人认为 IDisposable 仅针对非托管资源实现,但事实并非如此 - 非托管资源恰好是最大的胜利,也是实现它的最明显的原因。我认为它之所以获得这个想法是因为人们想不出任何其他理由来使用它。它不像终结器,终结器是一个性能问题,而且 GC 不容易处理好。

将所有整理代码放入您的 dispose 方法中。与试图记住撤消引用相比,它会更清晰、更干净,并且更容易防止内存泄漏,而且更容易正确使用。

IDisposable 的目的是让您的代码更好地工作,而无需您做大量的手动工作。利用它的力量对你有利,克服一些人为的“设计意图”废话。

我记得当 .NET 首次问世时,说服 Microsoft 确定性终结的有用性是非常困难的 - 我们赢得了这场战斗并说服他们添加它(即使当时它只是一种设计模式),使用它!

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

使用 IDisposable 取消订阅事件 的相关文章

  • 当操作系统显示语言为非英语时获取本地时区标识符

    奇怪的是 TimeZone CurrentTimeZone StandardName根据计算机显示语言返回本地化名称 我想要一个可以提供给的程序化标识符TimeZoneInfo在下面的代码中 TimeZoneInfo timeZoneInf
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • 使一个对象只能被同一程序集中的另一个对象访问?

    每个业务对象都有一个包含 sql 调用的匹配对象 我想限制这些 sql 对象 使其只能由匹配的业务对象使用 如何才能实现这一目标 Update 格雷格提出了关于可测试性的观点 由于 SqlObjects 将包含非常特定于业务流程的 sql
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 在 Delphi 中编程延迟的最佳方法是什么?

    我正在开发的 Delphi 应用程序必须延迟一秒 有时甚至两秒 我想使用最佳实践来对此延迟进行编程 在阅读 stackoverflow 上有关 Delphi Sleep 方法的条目时 我发现了以下两条评论 我遵循这样的格言 如果你觉得需要使
  • MSBuild 编译解决方案时找不到 SGen

    我在这里查看了其他几个与 SGen 相关的问题 要么他们的答案不适用 要么他们的答案不能为我解决这个问题 我安装了几个 SDK 来解决这个问题 但没有成功 不应更改引用类型 因为这是唯一出现问题的地方 一次建议是将 SGen exe 放入C
  • ASP.NET 更新面板停止 jquery 工作

    我已经为 mouseenter mouseleave 以及 jquery Draggable 绑定了 jquery 事件集 div 被放置在更新面板中 当单击按钮时 信息将发送到数据库并更新更新面板 但是 当面板更新时 jquery 事件不
  • C# 可空相等运算,为什么 null <= null 解析为 false? [复制]

    这个问题在这里已经有答案了 为什么在 NET中会这样 null gt null 解析为 false 但是 null null 解析为真 换句话说 为什么不null gt null相当于null gt null null null 有谁有官方
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • 在网站/Web 应用程序项目和 Script#/ScriptSharp 之间共享代码

    我向我的网站项目添加了一个 Script 项目 并创建了一个包含两个类的小型示例库 现在我想使用网站代码中的这些类 在本例中 我创建了一个简单的对象树并将其序列化为 JSON 然后由客户端代码获取 我尝试添加对 Script 项目的引用 它
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • BlockingCollection.Dispose 实际上做了什么?

    BlockingCollection Dispose 实际上做了什么 这允许正确处理内部等待句柄 BlockingCollection
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with

随机推荐

  • UITextField 在 iOS 5 中导致崩溃,在 iOS 4 中工作正常

    我有一个非常奇怪的问题 如果我单击 UITextField 我的应用程序中的任何 UITextField 都会崩溃并出现以下错误 0 CreateCachePathEmbedded CFString const 无符号字符 0x0246ac
  • Hibernate LazyInitializationException on find() 与 EAGER @ElementCollection

    我正进入 状态org hibernate LazyInitializationException illegal access to loading collection在我的 JPA 代码中 当集合实体也有一个集合时 所有集合都是 EAG
  • android:在设备旋转时禁用 opengl ES 上下文切换

    我有一个 Android 全屏 opengl es 应用程序 当设备从纵向旋转到横向并返回时 gl 上下文将被破坏并重新创建 有办法避免这种情况吗 即始终保持纵向或横向 编辑 我的活动中已经有这个代码 Override protected
  • 在设备上使用 ACRA Logcat 为空

    所以我使用 ACRA 4 4 0 和所有默认值 并且我的 logcat 字段为空 我的应用程序有
  • 如何使用java httpclient实现大文件的HTTP Post分块上传?

    我有一个巨大的文件要上传 另一端的服务器确实支持分块上传 有没有具体的例子说明如何做到这一点 或者还有其他库可以做到这一点 使用 HttpClient 4 来自 Apache HttpPost post new HttpPost url M
  • 如何通过Java编码调用浏览器?

    我想通过 Java 接口调用浏览器 例如 Internet Explorer Firefox Google Chrome Opera 我还需要将一些 Web 链接传递给这个 Java 进程 如何实现这一目标 您可以使用桌面API http
  • WebView getScrollY() 始终返回 0

    我尝试使用 webview 的滚动位置来确定 SwipeRefreshLayout 是否应该能够刷新 除了某些网站 例如https jobs lever co memebox https jobs lever co memebox getS
  • 所以...NoSQL 的事情

    我一直在研究 MongoDB 并且着迷 看来 尽管我不得不怀疑 作为以稍微不同的方式组织数据库的交换 我获得了与免费的 CPU 和 RAM 一样多的性能 它看起来优雅 灵活 但我不会像使用 Rails 那样以快速换取它 那么有什么问题呢 关
  • 为什么这个简单的 Spark 程序不利用多核?

    因此 我在 16 核多核系统上运行这个简单的程序 我运行它 通过发布以下内容 spark submit master local pi py 该程序的代码如下 pi py from pyspark import SparkContext i
  • WSO2 ESB 覆盖 ContentType 属性

    我正在开发 WSO2 ESB 代理服务 该服务涉及通过 ESB 上的 SOAP 端点公开内部 RESTful 服务 我的 RESTful 服务需要 Content type application rdf xml 我尝试使用文档中提到的所有
  • 如果函数创建并返回一个对象,它是否应该在自动释放池中

    我对 Objective C 还是很陌生 据我所知 任何我没有从 alloc new copy 或 mutableCopy 获得的对象都应该被假定在自动释放池中 我认为这也意味着 如果我创建一个创建并返回对象的新实例的函数 我应该在返回之前
  • 在lstm语言模型中使用预训练的word2vec?

    我用tensorflow来训练LSTM语言模型 代码来自here https github com tensorflow models blob master tutorials rnn ptb ptb word lm py 根据文章her
  • 将多个 json 数据添加到 panda 数据帧

    我正在使用 api 获取 3 个 json 数据 我想将这些数据添加到 1 个 panda 数据帧 这是我的代码 我传入的书籍中包含书籍 id 作为 x 这 3 个 id 返回了 3 个不同的 json 对象 其中包含所有书籍信息 for
  • WPF DataGrid CanUserAddRows = True

    我似乎在向 a 添加行时遇到问题DataGrid通过界面本身 这是用户界面的屏幕截图 正如您所看到的 在数据 库中找到了 0 行 因此没有任何内容显示在数据库中DataGrid在右侧 但我喜欢那里有一个空行 用于手动添加行 这DataGri
  • 获取 iOS Swift 中的顶级 ViewController

    我想实现一个单独的 ErrorHandler 类 它显示某些事件的错误消息 此类的行为应该从不同的其他类中调用 当发生错误时 会有一个UIAlertView作为输出 此 AlertView 的显示应始终位于顶部 因此 无论错误从哪里抛出 最
  • 如何将 RPC 与 Volttron 结合使用

    我想在我的 volttron 应用程序中使用 RPC 调用 但我无法让任何调用正常工作 所有调用都会失败 并出现 没有到主机的路由 错误
  • 为什么 Django 开发服务器会挂在这个管理工具 JS 文件上?

    使用 Django 管理工具时 它会定期挂起并停止响应请求 直到重新启动为止 每当它挂起时 日志中的最后一行是 获取 admin jsi18n HTTP 1 1 200 2158 挂起似乎发生在 POST 之后 例如查看添加对象的结果时 据
  • flowtype如何用可选字段注释联合

    如何在流程中实现以下目标 export type Response err string data Array data Array 我想表达一种类型 它返回错误和可选数据 或者不返回错误字段 如果没有 但是 我用它作为 return er
  • “npx tsc --version”报告虚拟机内不同的 TypeScript 版本

    我希望能够跑步npx tsc在我的主机 来宾操作系统上的项目中 但客人正在使用不同的 旧的 版本tsc 我不确定它是从哪里来的 我的设置 主机操作系统 Windows 10 来宾操作系统 Debian 9 我正在使用 VirtualBox
  • 使用 IDisposable 取消订阅事件

    我有一个处理来自 WinForms 控件的事件的类 根据用户正在执行的操作 我引用该类的一个实例并创建一个新实例来处理同一事件 我需要首先从事件中取消订阅旧实例 很简单 如果可能的话 我想以非专有的方式执行此操作 这似乎是 IDisposa