簡體   English   中英

“對目標對象的后期綁定訪問”是什么意思?

[英]What does "late-bound access to the destination object" mean?

Interlocked.Exchange<T>的文檔包含以下注釋:

此方法重載優於Exchange(Object, Object)方法重載,因為后者需要對目標對象進行后期綁定訪問。

我對這個筆記感到非常困惑。 對我來說,“后期綁定”指的是運行時方法調度,似乎與原子交換兩個內存位置的技術細節沒有任何關系。 筆記在說什么? 在這種情況下,“后期訪問”是什么意思?

canton7 的回答是正確的,感謝您的支持。 我想補充幾點。

這句話在 .NET 文檔中經常出現,兩者都選擇構建奇怪的單詞用法,並且完全沒有抓住要點。 對我來說,突出的糟糕的詞選擇不是“遲到”,它只是沒有抓住重點。 真正糟糕的詞選擇是使用“目標對象”來表示變量 變量不是對象,就像你的襪子抽屜不是一雙襪子一樣。 變量包含對對象的引用,就像襪子抽屜包含襪子一樣,不應混淆這兩件事。

正如您所注意到的,更喜歡T版本的原因與后期綁定無關。 喜歡T版本的原因是C# 不允許對ref arguments 進行變體轉換 如果您有一個Turtle類型的變量shelly ,則不能將ref shelly傳遞給采用ref object的方法,因為該方法可以將Tiger寫入ref object

那么在shelly上使用Object重載的邏輯后果是什么? 只有兩種可能:

  • 我們將shelly的值復制到Object類型的第二個變量,進行交換,然后將新值復制回來,現在我們的操作不再是原子的,這就是調用互鎖交換的全部意義所在
  • 我們將shelly更改為Object類型,現在我們處於一個非靜態類型且因此容易出錯的世界,我們無法確定shelly仍然包含對Turtle的引用。

由於這兩種替代方案都很糟糕,您應該使用泛型版本,因為它允許別名變量在整個操作中都是正確的類型

Interlocked.Exchange(object, object)的等效注釋是:

從 .NET Framework 2.0 開始, Exchange<T>(T, T)方法重載為引用類型提供了類型安全的替代方法。 我們建議您調用它而不是這個重載。

盡管我以前從未聽說過以這種方式使用它,但我認為“后期綁定”僅表示“非類型安全”,因為您需要在使用它之前將object為您的具體類型(在運行時)。


除了虛擬方法分派,“后期綁定”通常也指反射,因為要類似地調用的確切方法直到運行時才知道。

引用Eric Lippert 的話

基本上,“早期綁定”是指“綁定分析由編譯器執行並嵌入到生成的程序中”; 如果綁定失敗,則程序不會運行,因為編譯器沒有進入代碼生成階段。 “后期綁定”是指“綁定的某些方面將由運行時執行”,因此綁定失敗將表現為運行時失敗

(強調我的)。 在這個相當松散的定義下,將object轉換為具體類型然后在其上調用方法可以被視為“后期綁定”,因為綁定的一個元素在運行時執行,並且可能在運行時失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM