第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

早期和晚期綁定

早期和晚期綁定

C#
慕虎7371278 2019-12-13 09:56:36
當(dāng)C#中發(fā)生早期/晚期綁定時(shí),我想盡我所能。非虛擬方法始終是早期約束。虛擬方法總是晚綁定的:編譯器插入額外的代碼來(lái)解析在執(zhí)行時(shí)綁定到的實(shí)際方法,并檢查類型安全性。因此,亞型多態(tài)性使用后期綁定。使用反射的調(diào)用方法是后期綁定的一個(gè)示例。我們編寫代碼來(lái)實(shí)現(xiàn)此目的,而不是編譯器。(例如,調(diào)用COM組件。)關(guān)閉Option Strict時(shí),VB.NET支持隱式后期綁定。將對(duì)象分配給聲明為Object類型的變量時(shí),它將被后期綁定。VB編譯器在執(zhí)行時(shí)插入代碼以綁定到正確的方法并捕獲無(wú)效的調(diào)用。C#不支持此功能。我朝著正確的方向前進(jìn)嗎?通過(guò)接口引用調(diào)用委托和調(diào)用方法呢?是早期綁定還是后期綁定?
查看完整描述

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)有的基本方法。


查看完整回答
反對(duì) 回復(fù) 2019-12-13
?
神不在的星期二

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)性。但這不是后期綁定。


查看完整回答
反對(duì) 回復(fù) 2019-12-13
?
白衣染霜花

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ù)情況選擇合適的綁定的決定。


查看完整回答
反對(duì) 回復(fù) 2019-12-13
  • 3 回答
  • 0 關(guān)注
  • 430 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)