[英]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
為您的具體類型(在運行時)。
除了虛擬方法分派,“后期綁定”通常也指反射,因為要類似地調用的確切方法直到運行時才知道。
基本上,“早期綁定”是指“綁定分析由編譯器執行並嵌入到生成的程序中”; 如果綁定失敗,則程序不會運行,因為編譯器沒有進入代碼生成階段。 “后期綁定”是指“綁定的某些方面將由運行時執行”,因此綁定失敗將表現為運行時失敗
(強調我的)。 在這個相當松散的定義下,將object
轉換為具體類型然后在其上調用方法可以被視為“后期綁定”,因為綁定的一個元素在運行時執行,並且可能在運行時失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.