"late-bound access to the destination object" 是什么意思?
What does "late-bound access to the destination object" mean?
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.
我对这张纸条感到很困惑。对我来说 "late binding" 指的是运行时方法分派,似乎与原子交换两个内存位置的技术细节没有任何关系。笔记在说什么? "late-bound access" 在这种情况下是什么意思?
Interlocked.Exchange(object, object)
的等效注释是:
Beginning with .NET Framework 2.0, the Exchange<T>(T, T)
method overload provides a type-safe alternative for reference types. We recommend that you call it instead of this overload.
虽然我以前没有听说过它以这种方式使用,但我认为 "late-bound" 它只是意味着 "non type-safe",因为你需要将 object
转换为你的具体类型(在运行时)在使用它之前。
除了虚拟方法调度,"Late Binding" 通常也指反射,因为类似地调用的确切方法直到运行时才知道。
引用Eric Lippert:
Basically by "early binding" we mean "the binding analysis is performed by the compiler and baked in to the generated program"; if the binding fails then the program does not run because the compiler did not get to the code generation phase. By "late binding" we mean "some aspect of the binding will be performed by the runtime" and therefore a binding failure will manifest as a runtime failure
(强调我的)。在这个相当宽松的定义下,将 object
强制转换为具体类型然后在其上调用方法可以被视为 "late bound",因为有一个绑定元素在以下位置执行,并且可能会失败,运行时间。
canton7 的回答是正确的,感谢您的点赞。我想补充几点。
这句话,就像 .NET 文档中经常出现的情况一样,都选择构造奇怪的单词用法,完全没有抓住要点。对我来说,最糟糕的选词不是 "late bound",这只是没有抓住要点。真正糟糕的单词选择是使用 "destination object" 来表示 变量 。变量不是对象,就像你的袜子抽屉不是一双袜子一样。变量 包含对对象的引用 ,就像袜子抽屉里放袜子一样,这两者不应混淆。
正如您所注意到的,更喜欢 T
版本的原因与后期绑定无关。更喜欢 T
版本的原因是 C# 不允许对 ref
参数 进行变体转换。如果你有一个 Turtle
类型的变量 shelly
,你不能将 ref shelly
传递给采用 ref object
的方法,因为该方法可以将 Tiger
写入ref object
.
那么在 shelly
上使用 Object
超载的逻辑结果是什么?只有两种可能:
- 我们把
shelly
的值复制到第二个Object
类型的变量,做交换,然后把新值复制回来,现在我们的操作是no更长的原子,这是调用互锁交换的全部意义。
- 我们将
shelly
更改为 Object
类型,现在我们处于一个非静态类型且因此容易出错的世界,我们无法确定 [=13] =] 仍然包含对 Turtle
. 的引用
由于这两种选择都很糟糕,您应该使用通用版本 ,因为它允许别名变量在整个操作过程中都是正确的类型。
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.
我对这张纸条感到很困惑。对我来说 "late binding" 指的是运行时方法分派,似乎与原子交换两个内存位置的技术细节没有任何关系。笔记在说什么? "late-bound access" 在这种情况下是什么意思?
Interlocked.Exchange(object, object)
的等效注释是:
Beginning with .NET Framework 2.0, the
Exchange<T>(T, T)
method overload provides a type-safe alternative for reference types. We recommend that you call it instead of this overload.
虽然我以前没有听说过它以这种方式使用,但我认为 "late-bound" 它只是意味着 "non type-safe",因为你需要将 object
转换为你的具体类型(在运行时)在使用它之前。
除了虚拟方法调度,"Late Binding" 通常也指反射,因为类似地调用的确切方法直到运行时才知道。
引用Eric Lippert:
Basically by "early binding" we mean "the binding analysis is performed by the compiler and baked in to the generated program"; if the binding fails then the program does not run because the compiler did not get to the code generation phase. By "late binding" we mean "some aspect of the binding will be performed by the runtime" and therefore a binding failure will manifest as a runtime failure
(强调我的)。在这个相当宽松的定义下,将 object
强制转换为具体类型然后在其上调用方法可以被视为 "late bound",因为有一个绑定元素在以下位置执行,并且可能会失败,运行时间。
canton7 的回答是正确的,感谢您的点赞。我想补充几点。
这句话,就像 .NET 文档中经常出现的情况一样,都选择构造奇怪的单词用法,完全没有抓住要点。对我来说,最糟糕的选词不是 "late bound",这只是没有抓住要点。真正糟糕的单词选择是使用 "destination object" 来表示 变量 。变量不是对象,就像你的袜子抽屉不是一双袜子一样。变量 包含对对象的引用 ,就像袜子抽屉里放袜子一样,这两者不应混淆。
正如您所注意到的,更喜欢 T
版本的原因与后期绑定无关。更喜欢 T
版本的原因是 C# 不允许对 ref
参数 进行变体转换。如果你有一个 Turtle
类型的变量 shelly
,你不能将 ref shelly
传递给采用 ref object
的方法,因为该方法可以将 Tiger
写入ref object
.
那么在 shelly
上使用 Object
超载的逻辑结果是什么?只有两种可能:
- 我们把
shelly
的值复制到第二个Object
类型的变量,做交换,然后把新值复制回来,现在我们的操作是no更长的原子,这是调用互锁交换的全部意义。 - 我们将
shelly
更改为Object
类型,现在我们处于一个非静态类型且因此容易出错的世界,我们无法确定 [=13] =] 仍然包含对Turtle
. 的引用
由于这两种选择都很糟糕,您应该使用通用版本 ,因为它允许别名变量在整个操作过程中都是正确的类型。