3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
除非您通過(guò)Reflection接口,否則所有內(nèi)容都在C#中早期綁定。
早期綁定只是意味著在編譯時(shí)找到目標(biāo)方法,并創(chuàng)建將調(diào)用此方法的代碼。不管它是虛擬的(意味著在通話時(shí)還有一個(gè)額外的步驟來(lái)查找它都是無(wú)關(guān)緊要的)。如果該方法不存在,則編譯器將無(wú)法編譯代碼。
后期綁定意味著在運(yùn)行時(shí)查找目標(biāo)方法。該方法的文本名稱通常用于查找它。如果該方法不存在,請(qǐng)爆炸。該程序?qū)⒃谶\(yùn)行時(shí)崩潰或進(jìn)入某些異常處理方案。
大多數(shù)腳本語(yǔ)言使用后期綁定,而編譯語(yǔ)言使用早期綁定。
C#(版本4之前的版本)不會(huì)后期綁定;他們可以使用反射API來(lái)做到這一點(diǎn)。該API編譯為通過(guò)在運(yùn)行時(shí)挖掘程序集來(lái)查找函數(shù)名稱的代碼。如果關(guān)閉Option Strict,則VB可以后期綁定。
綁定通常會(huì)影響性能。由于后期綁定需要在運(yùn)行時(shí)進(jìn)行查找,因此通常意味著方法調(diào)用比早期綁定方法調(diào)用慢。
對(duì)于正常功能,編譯器可以計(jì)算出它在內(nèi)存中的數(shù)字位置。然后,當(dāng)調(diào)用該函數(shù)時(shí),它可以生成一條指令以在該地址處調(diào)用該函數(shù)。
對(duì)于具有任何虛擬方法的對(duì)象,編譯器將生成一個(gè)v表。本質(zhì)上,這是一個(gè)包含虛擬方法地址的數(shù)組。每個(gè)具有虛擬方法的對(duì)象都將包含由編譯器生成的隱藏成員,即v表的地址。調(diào)用虛擬函數(shù)時(shí),編譯器將確定v表中適當(dāng)方法的位置。然后它將生成代碼以查看對(duì)象v表并在此位置調(diào)用虛擬方法。
因此,存在針對(duì)虛擬功能的查找。這是經(jīng)過(guò)高度優(yōu)化的,因此它將在運(yùn)行時(shí)非常迅速地發(fā)生。
早起
編譯器可以計(jì)算出被調(diào)用函數(shù)在編譯時(shí)的位置。
編譯器可以保證(在任何程序代碼運(yùn)行之前)該函數(shù)將存在并且可以在運(yùn)行時(shí)調(diào)用。
編譯器保證函數(shù)采用正確數(shù)量的參數(shù),并且參數(shù)類型正確。它還檢查返回值的類型正確。
后期綁定
查找將花費(fèi)更長(zhǎng)的時(shí)間,因?yàn)樗皇呛?jiǎn)單的偏移量計(jì)算,通常需要進(jìn)行文本比較。
目標(biāo)功能可能不存在。
目標(biāo)函數(shù)可能不接受傳遞給它的參數(shù),并且可能具有錯(cuò)誤類型的返回值。
通過(guò)某些實(shí)現(xiàn),目標(biāo)方法實(shí)際上可以在運(yùn)行時(shí)更改。因此,查找可以執(zhí)行不同的功能。我認(rèn)為這是在Ruby語(yǔ)言中發(fā)生的,您可以在程序運(yùn)行時(shí)在對(duì)象上定義新方法。后期綁定允許函數(shù)調(diào)用開始調(diào)用方法的新替代,而不是調(diào)用現(xiàn)有的基本方法。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
C#3使用早期綁定。
C#4使用dynamic
關(guān)鍵字添加了后期綁定。有關(guān)詳細(xì)信息,請(qǐng)參見Chris Burrow的博客條目。
對(duì)于虛擬方法還是非虛擬方法,這是一個(gè)不同的問(wèn)題。如果我調(diào)用string.ToString()
,則C#代碼將綁定到虛擬object.ToString()
方法。調(diào)用者的代碼不會(huì)根據(jù)對(duì)象的類型而改變。而是通過(guò)函數(shù)指針表調(diào)用虛擬方法。對(duì)象的實(shí)例指的是指向?qū)ο蟊淼?code>ToString()方法。字符串的實(shí)例具有指向其ToString()
方法的虛擬方法表。是的,這是多態(tài)性。但這不是后期綁定。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
早期綁定
該名稱本身描述了編譯器知道它是哪種對(duì)象,它包含的所有方法和屬性。聲明對(duì)象后,單擊點(diǎn)按鈕,.NET Intellisense將填充其方法和屬性。
常見示例:
ComboBox cboItems;
ListBox lstItems; 在上面的示例中,如果我們鍵入cboItem并在其后放置一個(gè)點(diǎn),它將自動(dòng)填充組合框的所有方法,事件和屬性,因?yàn)榫幾g器已經(jīng)知道它是組合框。
后期綁定
該名稱本身描述了編譯器不知道它是什么樣的對(duì)象,它包含的所有方法和屬性是什么。您必須將其聲明為一個(gè)對(duì)象,稍后需要獲取該對(duì)象的類型以及存儲(chǔ)在其中的方法。一切都會(huì)在運(yùn)行時(shí)知道。
常見示例:
對(duì)象objItems;
objItems = CreateObject(“ DLL或程序集名稱”); 在編譯期間,這里沒(méi)有確定objItems的類型。我們正在創(chuàng)建一個(gè)dll對(duì)象,并將其分配給objItems,因此一切都在運(yùn)行時(shí)確定。
早期綁定與后期綁定
現(xiàn)在進(jìn)入圖片……
由于此處沒(méi)有裝箱或拆箱,因此應(yīng)用程序在早期綁定中的運(yùn)行速度將更快。
由于智能感知將自動(dòng)填充,因此更容易在早期綁定中編寫代碼
早期綁定中的最小錯(cuò)誤,因?yàn)檎Z(yǔ)法是在編譯時(shí)本身檢查的。
后期綁定將支持所有類型的版本,因?yàn)橐磺卸荚谶\(yùn)行時(shí)決定。
如果使用后期綁定,則代碼對(duì)將來(lái)的增強(qiáng)的影響最小。
性能將是早期綁定中的代碼。兩者都有優(yōu)點(diǎn)和缺點(diǎn),這是開發(fā)人員根據(jù)情況選擇合適的綁定的決定。
- 3 回答
- 0 關(guān)注
- 430 瀏覽
添加回答
舉報(bào)