C 委託筆記

2021-06-03 13:18:42 字數 3077 閱讀 4026

什麼是委託?

宣告委託物件?

建立委託物件?

賦值委託?

組合委託?

為委託增加方法?

從委託移除方法?

呼叫委託?

委託的例項?

呼叫帶返回值的委託?

呼叫帶引用的委託?

匿名方法?

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 組合委託,此時委託就能夠依次執行多...