c# - "late-bound access to the destination object"是什么意思?

标签 c# .net concurrency late-binding interlocked

The docs for Interlocked.Exchange<T> 包含以下备注:

This method overload is preferable to the Exchange(Object, Object) method overload, because the latter requires late-bound access to the destination object.

我对这张纸条感到很困惑。对我来说,“后期绑定(bind)”指的是运行时方法分派(dispatch),似乎与原子交换两个内存位置的技术细节没有任何关系。笔记在说什么?在这种情况下,“后期绑定(bind)访问”是什么意思?

最佳答案

canton7 的回答是正确的,感谢大声喊叫。我想补充几点。

这句话,就像 .NET 文档中经常出现的情况一样,都选择了奇怪的单词用法,完全没有捕获要点。对我来说,最糟糕的词选择不是“后期绑定(bind)”,这只是没有捕获要点。真正糟糕的用词选择是使用“目标对象”来表示变量。变量不是对象,就像你的 socks 抽屉不是一双 socks 一样。变量包含对对象的引用,就像 socks 抽屉里放 socks 一样,这两者不应混淆。

如您所见,选择 T 版本的原因与后期绑定(bind)无关。更喜欢 T 版本的原因是 C# 不允许对 ref 参数进行变体转换。如果您有 Turtle 类型的变量 shelly,则不能将 ref shelly 传递给采用 ref object 的方法,因为该方法可以将 Tiger 写入 ref 对象

那么在 shelly 上使用 Object 重载的逻辑结果是什么?只有两种可能:

  • 我们将 shelly 的值复制到 Object 类型的第二个变量,进行交换,然后将新值复制回来,现在我们的操作不再是原子的,这就是调用互锁交换的全部意义
  • 我们将 shelly 更改为 Object 类型,现在我们处于一个非静态类型且因此容易出错的世界,我们永远无法确定shelly 仍然包含对 Turtle 的引用。

由于这两种选择都很糟糕,您应该使用通用版本因为它允许别名变量在整个操作过程中都是正确的类型

关于c# - "late-bound access to the destination object"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527848/

相关文章:

c# - 在没有 WebView 的情况下运行 JavaScript

c# - 这叫适配器? + 适配器与装饰器

c++ - 当我运行多个与 CPU 核心/线程数相匹配的线程时,每个线程会在单独的核心/线程上运行吗?

c# - NHibernate 无需代理即可获取对象

c# - 死掉的简单 MVVM 应用程序的列表框保持为空 - 我错过了什么?

c# - 使用MVVM,如何使用App.config动态生成 View

c# - 如何检测 SQL Server 2008 中是否正在使用实体?

c# - 我如何使用 Linq/Linq to Sql 来执行此操作?

c# - 如何在 NHibernate 中实现并发

concurrency - 绕圈发送消息。