C# 什么是;对目标对象的延迟绑定访问”;什么意思?
包含以下备注: 此方法重载比C# 什么是;对目标对象的延迟绑定访问”;什么意思?,c#,.net,concurrency,late-binding,interlocked,C#,.net,Concurrency,Late Binding,Interlocked,包含以下备注: 此方法重载比Exchange(Object,Object)方法重载更可取,因为后者需要对目标对象进行后期绑定访问 我被这张纸条弄糊涂了。对我来说,“后期绑定”指的是运行时方法调度,似乎与原子交换两个内存位置的技术细节无关。这张纸条在说什么?在此上下文中,“后期绑定访问”是什么意思?联锁的交换(对象,对象)的等价注释是: 从.NET Framework 2.0开始,Exchange(T,T)方法重载为引用类型提供了一种类型安全的替代方法。我们建议您调用它,而不是此重载 虽然我以前没
Exchange(Object,Object)
方法重载更可取,因为后者需要对目标对象进行后期绑定访问
我被这张纸条弄糊涂了。对我来说,“后期绑定”指的是运行时方法调度,似乎与原子交换两个内存位置的技术细节无关。这张纸条在说什么?在此上下文中,“后期绑定访问”是什么意思?联锁的
交换(对象,对象)
的等价注释是:
从.NET Framework 2.0开始,Exchange(T,T)
方法重载为引用类型提供了一种类型安全的替代方法。我们建议您调用它,而不是此重载
虽然我以前没有听说过它是以这种方式使用的,但我认为“后期绑定”的意思只是“非类型安全”,因为在使用它之前,您需要将对象
强制转换为您的具体类型(在运行时)
与虚拟方法调度一样,“后期绑定”通常也指反射,因为类似地调用的确切方法直到运行时才知道 引述: 基本上,“早期绑定”是指“绑定分析由编译器执行,并嵌入到生成的程序中”;如果绑定失败,则程序不会运行,因为编译器没有进入代码生成阶段所谓“后期绑定”,我们的意思是“绑定的某些方面将由运行时执行”,因此绑定失败将表现为运行时失败
(我的重点)。在这个相当松散的定义下,将
对象
强制转换为具体类型,然后对其调用方法可能被视为“后期绑定”,因为绑定中有一个元素在运行时执行,并且可能在运行时失败。canton7的回答是正确的,感谢您的支持。我想补充几点
这句话,就像.NET文档中经常出现的情况一样,既选择了隐藏奇怪的词语用法,又完全没有抓住要点。对我来说,最糟糕的词语选择并不是“迟到”,它只是没有抓住要点。真正糟糕的词语选择是使用“目的地对象”来表示变量。变量不是对象,就像你的袜子抽屉是一双袜子一样。变量包含对对象的引用,就像袜子抽屉包含袜子一样,这两件事不应该混淆
正如您所注意到的,选择T
版本的原因与后期绑定无关。首选T
版本的原因是C#不允许对ref
参数进行变量转换。如果您有类型为Turtle
的变量shelly
,则不能将ref shelly
传递给采用ref对象的方法,因为该方法可以将Tiger
写入ref对象
那么使用对象
-对shelly
进行重载的逻辑后果是什么?只有两种可能性:
- 我们将
shelly
的值复制到类型为Object
的第二个变量,进行交换,然后将新值复制回来,现在我们的操作不再是原子的,这就是调用联锁交换的全部意义
- 我们将
shelly
更改为Object
类型,现在我们处于一个非静态类型,因此容易出现错误的世界,在这个世界上,我们永远无法确定shelly
是否仍然包含对Turtle
的引用
由于这两种备选方案都很糟糕,因此您应该使用通用版本,因为它允许在整个操作过程中使用正确类型的别名变量