什么是“对目标对象的延迟绑定访问”?

6
Interlocked.Exchange<T>的文档中包含以下注释:
这种方法重载比Exchange(Object, Object)方法重载更可取,因为后者需要对目标对象进行晚期绑定访问。
我对这个注释感到困惑。 对我来说,“晚期绑定”是指运行时方法调度,似乎与原子交换两个内存位置的技术细节无关。 这个注释在说什么? 在这种情况下,“晚期绑定访问”是什么意思?
2个回答

10
canton7的回答是正确的,并感谢他的帮忙。我想再补充一些要点。
这个句子,像在.NET文档中经常发生的情况一样,选择了用诡异的单词组织方式,并且完全错过了重点。对我来说,最糟糕的单词选择不是"late bound",它仅仅错过了重点。真正可怕的单词选择是使用"destination object" 来表示变量。变量不是对象,就像你的袜子抽屉不是一双袜子一样。变量 包含一个指向对象的引用,就像袜子抽屉包含袜子一样,这两个东西不应该混淆。
正如你所注意到的,偏好使用 T 版本的原因与晚期绑定无关。偏好使用 T 版本的原因是 C# 不允许在ref 参数上进行变体转换。如果你有一个类型为 Turtle 的变量 shelly,你不能将 ref shelly 传递给一个需要 ref object 的方法,因为该方法可以将一个 Tiger 写入到 ref object 中。
那么,在 shelly 上使用 Object 版本的逻辑后果是什么呢?只有两种可能性:
  • 我们将 shelly 的值复制到第二个类型为 Object 的变量中,进行交换,然后再将新值复制回来,现在我们的操作不再是原子操作了,而这正是调用互锁交换的全部目的
  • 我们将 shelly 改为类型为 Object,现在我们处于一个非静态类型化的且容易出现错误的世界,我们永远无法确定 shelly 是否仍然包含对 Turtle 的引用。
由于这两种替代方案都很糟糕,所以你应该使用泛型版本,因为它允许别名变量在整个操作过程中保持正确的类型

6
Interlocked.Exchange(object, object) 的等效说明为:

从 .NET Framework 2.0 开始,Exchange<T>(T, T) 方法提供了一种类型安全的替代方法,适用于引用类型。我们建议您调用它而不是这个重载。

虽然我以前没有听说过这种用法,但我认为“late-bound”就是指“非类型安全”,因为你需要在使用之前将 object 强制转换为你的具体类型 (在运行时)。


除了虚拟方法调度外,“Late Binding”通常也指反射,因为同样直到运行时才知道要调用的确切方法。

引用Eric Lippert的话:

基本上,通过“early binding”,我们的意思是“绑定分析由编译器执行并嵌入到生成的程序中”; 如果绑定失败,则程序不会运行,因为编译器没有进入代码生成阶段。通过“late binding”,我们的意思是“绑定的某些方面将由运行时执行”,因此绑定失败将表现为运行时失败

(强调是我的). 根据这个相当松散的定义,将 object 强制转换为具体类型,然后调用它的方法也可以被视为“late bound”,因为绑定的某些方面是在运行时执行并可能会失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接