前期繫結和後期繫結

2022-02-21 12:48:28 字數 1170 閱讀 7664

以vb為例

後期繫結:

將物件分配給乙個宣告為objcet型別的變數,若將乙個變數宣告為variant or ojbect ,(包含as form,as control變數),vb編譯時就無法確定該變數講引用那種型別的物件,應用程式只能在執行時確定物件的屬性和方法。

使用後期繫結,每次呼叫屬性或者方法時,vb都將成員名傳給該物件idispatch介面的方法-getidsofnames方法,getidsofnames返回 該成員的id或者dispid,vb程式再將dispid傳給idispathch介面的invoke方法來呼叫該成員。

對於程序外部件而言,這就意味著一次『額外跨程序呼叫,呼叫開銷增大。

(idispatch介面:idispatch介面把所有成員函式的入口位址放入到乙個陣列中,並且內部組織了乙個map,將陣列索引和方法名稱一一影射,dispid(com 事件或者函式的排程 id)就是這些方法在陣列中的索引。通過dispid可以找到該方法的位址,呼叫該方法。

前期繫結:

vb在編譯時就知道屬性或者方法所在物件。

前期幫定預先知道函式成員在型別中的dispid,不需要呼叫getidsofnames方法。而且早期繫結允許程式在編譯時分配記憶體,或者進行其他優化,從而生成更高效的應用程式。

比較:可見,前期繫結的效率高於後期繫結的效率,在程序內建立物件,據說速度比例是2:3,也就是說1.5倍,本文沒有實際計算。而且前期繫結,在整合開發環境下,方法成員會自動顯示。前期繫結會減少執行時的錯誤。但前期幫定時,在vb下需要引用該dll,如果被引用的元件不存在,整個引用程式也不能執行,如果是後期繫結,只要在建立物件createobect時才會拋錯。前期幫定時,如果被引用元件版本不同,可能會有相容性問題,但是如果是後期繫結,則沒有問題。

例如:定義工程1中定義類clstry

方法:public function showmessage() as string

showmessage = "this is result"

end function

1 引用工程

dim str as new clstry

msgbox str.showmessage

2 不引用工程

dim str as object

set str = createobject("vbptry.clstry")

msgbox str.showmessage

php 後期繫結

自 php 5.3.0 起,php 增加了乙個叫做後期靜態繫結的功能,用於在繼承範圍內引 用靜態呼叫的類。準確說,後期靜態繫結工作原理是儲存了在上乙個 非 呼叫 non forwarding call 的類名。當進行靜態方法呼叫時,該類名即為明確指定的那個 通常在 運算子左側部分 當進行非靜態方法呼...

php後期靜態繫結

後期靜態繫結 static 不再被解析為定義當前方法或屬性所在的類,而是在實際執行時計算的 可用 get called class 函式來得到被呼叫的方法所在的類名 this是指向當前物件 self 指向當前的類 self就是寫在哪個類裡面,實際呼叫的就是這個類 parent 指向父類 static...

C 後期繫結操作Excel

後期繫結的好處是 對於不同版本的軟體都能支援。如果機器a上安裝的office 2003,機器b上安裝office 2007,沒問題,下面 都能正常執行。但是如果採用前期繫結就不行了。關於 前期繫結和後期繫結 excel專業開發 一書的3.3.3節 43頁 說的非常清楚。private void te...