委託是用來處理其他語言使用函式指標解決問題時的對應辦法。不過不同於c++的函式指標,委託是完全面對物件的;另外c++指標僅指向成員函式,而委託同時封裝了物件例項和方法。
委託定義了乙個從system.delegate類派生的類。委託例項封裝乙個呼叫列表,該列表列出乙個或多個方法,其中每個方法均作為乙個可呼叫實體來引用。對於例項方法,可呼叫實體由該方法和乙個相關聯的例項組成;對於靜態方法,可呼叫實體僅由乙個方法組成。用乙個適當的引數集來呼叫乙個委託例項,就是用此給定的引數集來呼叫該委託例項的每個可呼叫實體。
委託例項的特別的屬性:它不關心所封裝的方法所屬的類,只在乎這些方法必須和委託的型別相容。
15.1委託宣告
new修飾符僅允許出現在其他型別中宣告的委託上使用,表示所宣告的委託會隱藏具有相同名稱的繼承成員。
當方法和委託有相同的返回型別,且具有相同的引數數目,引數型別、順序和修飾符相同,那麼就說方法和委託型別是相容的。
c#中方的委託型別是名稱等效,而不是結構等效。意思就是兩個委託型別,即使具有相同的引數列表和返回型別,仍被認為是不同的兩個委託型別;不過像這樣彼此不同但結構上相同的委託型別,它們例項在比較時可以認為是相等關係。比如:
其中,d1和d2都與a.m1和b.m1相容,但d1和d2是兩個不同的型別。d1和d2與類b的m2、m3和m4不相容,因為返回型別或引數列表不同。
委託型別是從system.delegate派生出來的類型別,隱含sealed,所以不允許從委託型別派生任何型別。system.delegate本身同樣不是委託型別,而是類型別。
c#設定了專門的語法用於委託型別的例項化和呼叫,除例項化外,所有可以應用於類或類例項的操作也可以應用於委託類或委託例項。
委託例項所封裝的方法合成呼叫列表。從某個方法建立乙個委託例項時,該委託例項將封裝此方法,此時它的呼叫只包含乙個進入點。但當組合兩個非空委託例項時,它們的呼叫表被連線在一起,按左運算元優先,然後右運算元在後的順序組成乙個新的呼叫列表,它此時就包含了兩個或更多的進入點。
委託還可以使用+、+=、-、-=來組合。比如:
15.2委託例項化
委託的例項由委託建立表示式建立,因此新建立的委託例項將引用一下各項之一:1.委託建立表示式中引用的靜態方法;
2.委託建立表示式中引用的目標物件(不能為null)和例項方法;
3.另乙個委託。
委託例項一旦被例項化後,將始終引用同乙個目標物件和方法。當組合兩個委託或從組合委託中移除乙個委託時,會產生新的委託,新委託由自己的呼叫列表,組合委託保持不變。
15.3委託呼叫
c#為呼叫委託提供了專門的語法:
當呼叫列表包含多個進入點的委託例項時,那麼呼叫委託例項就是按順序同步地呼叫各個方法。以這種方式呼叫的每個方法都使用相同的引數集。如果這樣的委託呼叫包含引用引數,那麼每個方法呼叫都將使用同乙個變數的引用;若期間某個方法對該變數進行更改,後面的方法都會見到此變更;如果委託呼叫包含輸出引數或返回值,則它們的最終只就是最後乙個方法呼叫所產生的結果。
試圖呼叫值為null的委託例項將導致system.nullreferenceexception型別的異常。
當移除委託時,實際上移除的是呼叫列表最後出現的那個委託;當從呼叫列表移除表中沒有的委託時,不算錯誤。最後的結果如圖:
(15)C 基礎 方法
文章目錄 方法是一種用於實現可以由物件或類執行的計算或操作的成員。類的方法主要是和類相關聯的動作,它是類的外部介面,對於那些私有字段來說,外部介面實現對它們的操作一般只能通過方法來實現。方法是包含一些列語句的 塊,在c 中每個執行命令都是在方法的上下文中完成的。方法是c 中將一堆 進行重用的一種機制...
15 c 物件導向設計
ifndef slump h define slump h 水果 class slump slump slump default 虛函式,如果希望子類可以有自己特定的版本,應使用virtual標識 virtual double price 純虛函式 含有純虛函式的類是抽象類,抽象類負責定義介面,子類...
15 C 筆記 結構體
示例 using system using system.text struct books public void display title console.writeline author author console.writeline subject subject console.wri...