事件处理程序和 C# 类析构函数/Dispose

2024-03-08

我对 C# 类及其解构函数有点困惑。

我必须在构造函数中获取的类实例中使用一些事件处理程序:

 public Foo(IFooHandler handler)
 {
     handler.Load += Load;
     handler.Close += Close;
 }

当 Foo 类被销毁时,我需要取消订阅该事件。我实施吗IDisposable并在其中或在解构函数中取消订阅?我需要消耗这些事件,我无法以其他方式做到这一点。

对于其中一个类,我创建一个实例,检查进度,然后该类实例超出范围。对于另一个它留在MainForm直到表格关闭。第一个是我担心的,因为它可能仍然引用该事件处理程序并且无法正确运行。

我不想泄漏内存。我应该何时以及如何取消订阅?


不要在析构函数中执行此操作,因为在附加事件处理程序时不会调用它:当您附加 Foo 的实例方法作为 Bar 事件的处理程序时,Bar 将保留对 Foo 的引用,因此 Foo不会被垃圾收集,并且它的析构函数不会被调用。

您应该实现 IDisposable,并显式处置您的对象

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

事件处理程序和 C# 类析构函数/Dispose 的相关文章

随机推荐

  • SCRIPT5009:“$”在 IE9 中未定义

    我有一个书签 它将 div 加载到当前页面并在其中放置一个 iframe 除了 IE9 之外 小书签在所有浏览器中都可以正常工作 甚至可以在早期版本的 IE 中使用 我正在使用以下书签框架 http idc anavallasuiza co
  • 如何隐藏 mkmapview monotouch iPhone 的合法链接

    MKMapview 在其右下角有合法链接 我想在这个地方添加一个按钮 该按钮具有某种透明度 我可以隐藏法律链接吗 或者 如果我以隐藏此链接的方式设置按钮 苹果可能会拒绝我的应用程序 我的地图视图中也有一些类型的子视图 尝试使用这个 但我不知
  • 使用 dbcontext 的正确方法(全局还是作为参数传递?)

    当我调用需要的方法时dbcontext for update or insert但只想要一个saveChange 喜欢关注 操作 登录 TempDBEntity context new TempDBEntity var temp conte
  • 如何从 PHP 中的 Base 64 字符串获取图像大小

    我正在获取图像字符串的基数 64 我必须移动文件夹并将图像路径存储在数据库中 但我必须限制文件大小 我该如何执行此操作 我从 Base 64 字符串生成图像的代码如下 if image is attached with request Im
  • 一个拼接语法类,匹配可选模式并绑定属性

    我的拼接语法类定义如下 语法类匹配两个语句 第一个模式 其中一个语句 第三个和第二个模式 的序列 甚至可能根本不匹配这些语句 最后一个模式 正如您所看到的 有相当多的 重复 代码 因为每个模式要么返回模式中捕获的某些内容的属性 要么返回空的
  • 开始在雪花上使用 liquibase

    我正在尝试在雪花上开始使用 liquibase 我想我已经差不多完成了 liquibase properties 文件 driver net snowflake client jdbc SnowflakeDriver classpath l
  • Jersey REST Web 服务、Tomcat、Eclipse 和 404

    我读了很多帖子 但似乎无法解决我的问题 您还会看到大量与此帖子非常相似的帖子 甚至是相同的教程 即使跟随他们 我似乎也无法得到答案 本质上 我正在尝试遵循以下简单教程 http www vogella com articles REST h
  • 使用 jTD 连接到 SQL Server 2012

    尝试使用 JDBC 连接到 SQL Server 2012 Express Edition 这是我的代码 import java sql public class MSSqlTestConnection public static void
  • 以最少的字符数表示长

    我需要用尽可能短的字符串来表示非常大和非常小的数字 这些数字是无符号的 我尝试过直接 Base64 编码 但对于一些较小的数字 编码的字符串比仅将数字存储为字符串要长 在 URL 安全的情况下 在尽可能短的字符串中以最佳方式存储非常大或非常
  • 将背景图像更改为按钮

    我正在尝试更改按钮的背景图像 但它没有像我想象的那样工作 CSS 没问题 如下 ITA float right margin 5px 85px width 40px height 40px background FFFFFF url ITA
  • 文件-通过本地文件路径上传

    有没有办法通过文件路径启用文件上传 默认 HTML 文件上传控件显示禁用的文本框和按钮 当用户将文件路径粘贴到文本框中时 是否可以通过 JS 或其他方式上传文件 该网页位于公司内部网内 不 这样的事情在使用普通 HTML JavaScrip
  • 使用 Symfony2(.7) 减少 Twig 中的表单组布局

    我试图摆脱 symfony2 表单中 twig 中的重复布局 目前我的布局看起来像
  • CSRF 令牌不匹配 |拉拉维尔 5.4

    每当我向服务器发送 POST 请求时 都会出现 TokenMismatchException 错误 我已经尝试过发送
  • 使用 .htaccess 将 http 和 https 的所有非 www 重定向到 www

    我想将所有非 www 重定向到 www 如果请求是通过 http 它应该重定向到http www domain com http www domain com 如果请求是通过 https 则直接到https www domain com h
  • 包含自身映射的 C++ 结构

    简单的问题 我如何让它发挥作用 struct A double whatever std unordered map
  • 更改 Windows 主机上 docker 容器内已安装文件夹中的文件权限

    免责声明 编辑2 几年后 对于每个读到这个问题的人 如果您在 Windows 上并且想要将 docker 与 Linux 容器一起使用 我强烈建议根本不要在 Windows 上使用 docker 而是完全在虚拟机内启动整个 docker 环
  • 为什么MediaCodec的解码器不输出统一的YUV格式(如YUV420P)?

    MediaCodec 解码器可以使用上述格式之一或专有格式在 ByteBuffer 中生成数据 例如 基于 Qualcomm SoC 的设备通常使用 OMX QCOM COLOR FormatYUV420PackedSemiPlanar32
  • Android 在 InAppBilling 中购买多个产品

    我正在使用 android InAppBilling 购买我的应用程序中的产品 我正在关注有关的文档https developer android com google play billing billing integrate html
  • 在选择选项下拉列表中选择 Angular 2 集

    我有 2 个 User 类型的对象 users有完整的用户列表 selectedUsers有getUsersBySid从数据库返回用户列表 所以我只想将由getUsersById selectedUsers我尝试了这个 但它不起作用
  • 事件处理程序和 C# 类析构函数/Dispose

    我对 C 类及其解构函数有点困惑 我必须在构造函数中获取的类实例中使用一些事件处理程序 public Foo IFooHandler handler handler Load Load handler Close Close 当 Foo 类