什麼是委託?
宣告委託物件?
建立委託物件?
賦值委託?
組合委託?
為委託增加方法?
從委託移除方法?
呼叫委託?
委託的例項?
呼叫帶返回值的委託?
呼叫帶引用的委託?
匿名方法?
lambda表示式?
委託:有相同簽名和返回值型別的有序方法列表
(1) 方法的列表稱為呼叫列表
(2) 當委託被呼叫時,它呼叫列表中的每乙個方法
例如:delegate void mydel(int x);
void 返回型別
mydel 委託型別名
mydel(int x) 簽名
返回型別和簽名指定了委託接受方法的形式
例如如上宣告的委託:只會接受不返回值,並且有單個int引數的方法。
委託變數的宣告:mydel delvar;
委託是引用型別,因此有引用和物件,因此有兩種方式:
1、 使用帶new運算子的物件建立表示式
2、 使用快捷語法,由方法的說明符構成
delvar=new mydel(myinstobj.mym1); 可以是例項方法或者靜態方法
或者delvar= myinstobj.mym1;
由於委託是引用型別,因此可以通過給它賦值來改變包含在委託變數中的引用
例如:mydel delvar;
delvar= myinstobj.mym1;
delvar=sclass.otherm2;
委託可以使用額外的運算子來「組合」,並最終會建立乙個新的委託
例如:如下**建立了3個委託,第三個委託由前兩個委託組合。
mydel dela= myinstobj.mym1;
mydel delb=sclass.otherm2;
mydel delc=dela+delb;
我們可以通過使用+=運算子為委託增加方法或者另乙個委託。
mydel delvar=inst.mym1;//建立並初始化
delvar += sc.m3; //增加方法
delvar += x.act; //增加方法
當使用 += 運算子時,實際發生的是建立了乙個新的委託。其呼叫列表時左邊的委託加上右邊方法的組合。
我們可以使用 -= 運算子從委託移除方法
delvar -= x.act; //從委託上移除x.act方法
與為委託新增方法一樣,其實是建立了乙個新的委託。
可以像呼叫方法一樣簡單的呼叫委託。呼叫委託中的引數將會用於呼叫列表中的每乙個方法。
例如:delegate void mydel(int x);
mydel delvar=inst.mym1;
delvar += s.m3;
delval(55); //呼叫委託
delvar委託接受乙個int型輸入值,呼叫委託就會使用相同的引數值(55)去呼叫它的呼叫列表中的每乙個成員。
乙個方法可以在呼叫列表中出現多次。
delegate void printdelegate();//宣告委託
class testdelegate
public static void print2()
}class program
}
如果委託有返回值並且在呼叫列表中有乙個以上的方法,會發生下列情況:
1、 呼叫列表中最後乙個方法返回的值就是委託呼叫返回的值
2、 呼叫列表中所有其他方法的返回值都會被忽略
delegate int printadd();//宣告委託
class testdelegate
public int add3()
}class program
", p1());
}else
console.read();
}}
這段**產生輸出:intvalue=12
如果委託有引用引數,引數值會根據呼叫列表中的乙個或多個方法的返回值而改變;
delegate void mydel(ref int x);
class myclass
public void add3(ref int x)
static void main()」,x);
}}這段**輸出 value:12
如果方法只會被使用一次,可以使用匿名方法
匿名方法:是在初始化委託時內聯宣告的方法
class program
delegate int otherdel(int param);
static void main()
console.writeline(del(5));
console.writeline(del(6));
如上演示了同乙個類的兩個版本。
左邊的版本宣告並使用了乙個名稱為add20的方法。
右邊的版本使用了匿名方法代替,左邊灰色底的**和右邊灰色底的**是等價的。
匿名方法的語法:
delegate (parameters)
parameters 為引數列表,如果語句塊沒有任何引數,則可以省略
implementationcode 包含匿名方法的**
為了簡化匿名方法的語法,c#3.0引入了lambda表示式,希望使用lambda表示式來替代匿名方法。
通過如下步驟把匿名方法轉換為lambda表示式;
1、 刪除delegate 關鍵字
2、 在引數列表和匿名方法主體之間放lambda運算子=>。lambda運算子讀作「goes to」
例如:mydel del=delegate(int x); //匿名表示式
mydel le1= (intx)=>;//lambda表示式
mydel le2= (x) =>;
mydel le3= x=>;
mydel le4= x=> x+1;
使用lambda表示式,如果沒有引數,必須使用一組空的圓括號。
C 委託(筆記)
委託 將方法作為引數進行傳遞的時候,需要利用到委託。如下例項 筆記 class bubble while swpped class employee 員工工資表 public string name public decimal money public static bool com employ...
C 筆記 委託
和類一樣,委託是使用者自定義的型別,但是類是資料和方法的集合,而委託是持有乙個或多個方法。delegate可以看做是乙個包含有序方法列表的物件,這些方法具有相同的簽名和返回型別。public delegate return type delegate name 關鍵字 返回型別 委託類簽名 引數列表...
C 「委託」學習筆記
using system using system.collections.generic using system.linq using system.text namespace delegatetest console.writeline sh3 jiang 組合委託,此時委託就能夠依次執行多...