在引发事件之前是否有任何理由将事件分配给局部变量?

2023-12-10

我经常看到如下代码,想知道是否有任何理由为事件使用局部变量,而不是仅仅使用事件本身。有没有?

var handler = OnQueryComplete;
if (handler != null)
    handler(this, new RepositoryEventArgs<T>(results));

是的,绝对 - 它使无效检查变得安全。

如果你只有:

// Bad code, do not use
if (OnQueryComplete != null)
{
    OnQueryComplete(this, ...);
}

那么最后一个订阅者可能会在检查和调用之间取消订阅,从而导致NullReferenceException.

lots这里的选项:

  • 决定您不关心线程安全,即使它抛出异常。 (在许多情况下,这可能是合理的,特别是如果这都是您自己的代码库。)
  • 使用扩展方法可以使此操作变得简单,因此无效检查无论如何都会消失。
  • 在 C# 6 中,使用条件 null 运算符:

    OnQueryComplete?.Invoke(this, ...);
    
  • 使用一个永远不会被删除的空处理程序设置事件:

    public event FooEventHander OnQueryComplete = delegate {};
    

您可能还想使用Interlocked确保您获得变量的最新值,以避免内存模型问题。看我的博客文章(包括评论)对此进行更多讨论。

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

在引发事件之前是否有任何理由将事件分配给局部变量? 的相关文章

  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • 将占位符文本添加到文本框

    我正在寻找一种将占位符文本添加到文本框的方法 就像在 html5 中使用文本框一样 IE 如果文本框没有文本 则会添加文本Enter some text here 当用户单击它时 占位符文本消失并允许用户输入自己的文本 如果文本框失去焦点并
  • CMake 警告:无法为目标生成安全的链接器搜索路径

    在为 pcl 项目运行 CMake 时 我收到一条警告消息 Configuring done CMake Warning at CMakeLists txt 12 add executable Cannot generate a safe
  • .NET 程序集大小会影响性能吗?

    net 程序集的大小是否会影响性能 您的 Windows 窗体 Web 窗体项目中的程序集数量如何 来自微软的模式和实践提高 NET 应用程序性能和可扩展性 http msdn microsoft com en us library ms9
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • initializer_list 和默认构造函数重载决策

    include
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • 基于 C++ 范围的 for 循环

    尝试使用基于范围的 for 循环执行某些操作 可以使用常规的 for 循环来完成 如下所示 vector
  • 如何使用 C# 代码使用超链接的 onClick 事件?

    我正在尝试为页面中的超链接添加条件 而不是仅仅使用特定的链接 例如 a href help Tutorial html Tutorial a 我想为不同的用户显示不同的页面 例如 如果用户以管理员身份登录 他们将看到与普通用户不同的链接 我
  • Unity 2.0 和处理 IDisposable 类型(特别是使用 PerThreadLifetimeManager)

    我知道类似的问题被问过好几次 例如 here https stackoverflow com questions 987761 how do you reconcile idisposable and ioc here https stac
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal

随机推荐

  • 了解 ImageMagick 的转换并转换为 Ruby RMagick

    我未能将以下 PHP ImageMagick 代码转换为 Ruby RMagick 以使未来的用户更易于管理并了解它真正在做什么 output array returnValue 0 pngFiles myDir gt find png i
  • 启用 Docker 远程 API - raspberry pi / raspbian

    我的出发点是 如何使用docker Remote api创建容器 所以我编辑 etc init docker conf并更新 2 次出现的DOCKER OPTS变量为 DOCKER OPTS H tcp 0 0 0 0 4243 H uni
  • “无法设置 Range 类的 Width 属性”

    我正在致力于自动化构建成本估算表 基于假设 规则 政策等 一切顺利 直到我想自动设置列宽 这里有一个简短的蒸馏 Dim NumCE As Integer Dim TotalWidth As Integer NumCE 1 Sheets Co
  • jqGrid 删除一行

    我已经创建了网格 并想使用网格的默认行为来删除一行 这是我的网格设置代码 grid jqGrid navGrid grid pager add true addtitle Add Customer edit true edittitle E
  • isReleaseBuild() 是 Android Gradle DSL 的一部分吗?

    我按照类似于以下的说明进行操作 Android Library Gradle 发布 JAR 但是 我收到以下错误 在项目 myProject 上找不到参数 的 isReleaseBuild 方法 我在 Maven 集成中看到的示例都没有定义
  • Pandas 数据帧太大而无法附加到 dask 数据帧?

    我不确定我在这里缺少什么 我认为 dask 可以解决我的内存问题 我有 100 多个以 pickle 格式保存的 pandas 数据帧 我希望将它们全部放在同一个数据框中 但不断遇到内存问题 我已经增加了 jupyter 中的内存缓冲区 看
  • Firefox 浏览器无法识别 table.cells 吗?

    我有以下 JavaScript 代码 var myCellCollection document getElementById myTbl cells 这在 IE 中效果很好 它返回表格单元格的集合 但同一行在 Firefox 中返回 未定
  • 在不使用配置规范的情况下从 Clearcase 复制具有特定标签的元素

    如何从中复制元素或文件Clearcase具有特定的label 不应用该label in config specs 我不想更改视图的配置规范 但我需要访问所选文件之一的旧版本 并且我想直接从现有视图执行此操作 同样 不更改任何内容 我知道我想
  • iOS 13 文本转语音(TTS - AVSpeechSynthesisVoice)更新后某些用户崩溃

    更新到 iOS 13 后 我们发现一小部分用户因 TTS 问题而出现奇怪的崩溃 有人知道为什么会发生这种情况吗 有人看到同样的崩溃吗 let voices AVSpeechSynthesisVoice speechVoices for vo
  • 使用空手道框架执行 API 测试时观察到 DNS 错误 [重复]

    这个问题在这里已经有答案了 在通过 karat 对 api 执行 get 调用时 当我使用的代理被注释时观察到 DNS 错误 但如果我使用代理 它会返回 401 错误 下面是以下代码 特征文件代码 Background url baseUr
  • 使用 Dask 导入大型 CSV 文件

    我正在使用 Dask 导入一个非常大的 csv 文件 680GB 但是 输出不是我所期望的 我的目标是仅选择一些列 6 50 并可能过滤它们 我不确定 因为似乎没有数据 import dask dataframe as dd file pa
  • SQL 截断、删除、删除建议

    我在 SQL 数据库中有一个表 想要从中删除数据 不过我想保留这些列 例如我的表有 3 列 姓名 年龄 日期 我不想删除这些 我只想删除数据 我应该截断 删除还是删除 不要删除 它会删除数据和定义 如果删除 数据就会消失 并且自动增量值将从
  • 如何将文本放置在边框上?

    我能够让它在白色背景下工作 但在背景不是白色的情况下 该解决方案也不起作用 我做了什么应该很明显为什么它不起作用 负边距 背景设置为背景颜色 有什么解决方案可以使它始终看起来不错吗 一种方法是使用间隔跨度和包装器 在本例中header 所有
  • Diesel:BoxableExpressions 在表及其连接上通用?

    我正在尝试在运行时构造一些过滤器 这些过滤器可以应用于表tunnel or to tunnel LEFT OUTER JOIN connection ON tunnel id connection tunnel id 这些表的定义如下 De
  • 剥离 HTML 标签以获取 python 中的字符串

    我尝试使用 BeautifulSoup 从 HTML 文件中获取一些字符串 每次使用它时我都会得到部分结果 我想获取每个 li 元素 标签中的字符串 到目前为止 我已经能够像这样获得 ul 中的所有内容 usr bin python fro
  • 对数据点拟合更好的高斯分布?

    我试图将高斯拟合到一组似乎遵循高斯分布的数据点 我已经检查了很多可能的方法来做到这一点 但我并不真正理解其中的大多数 然而 我找到了一个似乎有效的解决方案 但我得到的实际拟合结果看起来并不比我的数据点更像高斯 这是我的代码 import n
  • Magento - 订单详细信息不显示在管理面板中

    我们有一个电子商务 magento 商店 现在 我们遇到了一个奇怪的问题 我无法理解和调试 对于某些订单 虽然邮件已正确发送给客户并抄送至我们的电子邮件 ID 但 magento 管理的订单详细信息页面中未显示任何详细信息 管理订单详细信息
  • Flex 项目是块级元素吗?

    Flex 项目是 Flex 级别的元素 但它是块级别的元素吗 根据CSS 灵活框布局模块第 1 级第 4 章 弹性项目被认为是在弹性级别而不是在块级别 Flex 项目为其内容建立独立的格式化上下文 然而 弹性项目本身是弹性级别的 盒子 而不
  • 如何使用 boto3 将 S3 对象保存到文件

    我正在尝试用 new 做一个 hello world boto3AWS 的客户端 我的用例相当简单 从 S3 获取对象并将其保存到文件中 在 boto 2 X 中我会这样做 import boto key boto connect s3 g
  • 在引发事件之前是否有任何理由将事件分配给局部变量?

    我经常看到如下代码 想知道是否有任何理由为事件使用局部变量 而不是仅仅使用事件本身 有没有 var handler OnQueryComplete if handler null handler this new RepositoryEve