9yue7
委托? delegate
一、委托的概念
把方法作為一個參數來傳遞(方法是變化的)
二、聲明委托
訪問修飾符? delegate 返回值類型 委托類型名 (參數列表);
委托也是一種引用類型,和類一樣,需要我們自己來定義
定義時委托類型的返回值和參數與要引用的方法的返回值和參數一致,
二者在外形上一樣,只是委托用delegate修飾.
三、使用委托
委托三個步驟:1、委托聲明,
? ? ? ? ? ? ? ? ? ? ? ? GreetingDelegate greetingDelegate;
? ? ? ? ? ? ? ? ? ? ? ? 2、委托實例化 ,
? ? ? ? ? ? ? ? ? ? ? ? greetingDelegate = Test_1;
? ? ? ? ? ? ? ? ? ? ? ? 3、委托調用
? ? ? ? ? ? ? ? ? ? ? ? greetingDelegate();也可以這樣寫
也可以這樣寫:
// GreetingDelegate greetingDelegate = new GreetingDelegate (Test_1);
注:
委托類似于函數指針,但與函數指針不同的是,委托是面向對象的、類型安全的和保險的。
委托既能引用靜態方法,也能引用實例方法。
委托要綁定的方法 參數、返回值必須一樣;
四、委托的定義
委托是一個類,它定義了方法的類型,使得可以將方法當做另一方法的參數來進行傳遞,也即是方法的參數是一個委托變量,
在調用此方法時,就可以把一個方法做為參數傳遞給委托變量;
合并委托(多播)
調用一個委托就要調用委托的所有方法
委托可以+ - 綁定和解除綁定,多播委托包含已分配委托的列表。
在調用多播委托時,它會按照順序調用委托方法,只能合并相同類型的委托
注:
當委托綁定多個有返回值的方法時,其結果是最后綁定的那個方法的返回值,
前面綁定方法的返回值會被最后綁定方法的返回值所覆蓋,所以使用委托時一般不帶返回值.
總結:
一、委托和所引用的方法必須保持一致
1、參數 (個數、類型、順序)必須完全一致
2、返回值類型必須一致
二、一個委托被同時映射到靜態方法和實例方法,并分別返回特定的信息;
四種形式的委托
兩種寫法(格式):
匿名(在方法只用一次,不用專門寫出方法時),Lamda
兩種系統定義的委托類型:
(方便于不用再定義變量)
Func要有返回值,Action沒有返回值。
委托傳入的值是根據方法來定的
一、匿名委托
用法:委托變量在綁定方法時,是把方法名賦值給了委托變量名,
這樣就需要在類里面定義方法,而有些方法只用到了一次,
這樣的方法在類里面過多時,程序的可讀性就不是太好,
針對這種情況,可以使用匿名委托,即不用在類里面額外定義方法.
格式:delegate(參數){要執行的代碼};
參數:相當于綁定方法的參數
{};里面相當于綁定方法的方法體
由于是賦值,是一個語句,后面的;不要省
二、Iamda表達式
格式:(參數)=>{要執行的代碼};
參數:相當于綁定方法的參數
{};里面相當于綁定方法的方法體
由于是賦值,是一個語句,后面的;不要省
三、Func 委托
使用Func泛型,前面兩個是參數類型,最后一個是返回值類型,
其變量可以綁定匿名委托,lambda表達式和相同類型的方法,
此種委托一定會有返回值;
四、Action委托
格式
使用Action泛型,<>里面的類型是參數的類型,
該種委托可以綁定匿名委托,lambda表達式和方法,
但其一定沒有返回值