Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是;对目标对象的延迟绑定访问”;什么意思?_C#_.net_Concurrency_Late Binding_Interlocked - Fatal编程技术网

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
    的引用
由于这两种备选方案都很糟糕,因此您应该使用通用版本,因为它允许在整个操作过程中使用正确类型的别名变量