C 學習筆記之 委託 delegate

2022-09-14 17:36:20 字數 3135 閱讀 3898

菜鳥教程-委託

當遇到在執行時才能決定用哪種方法的時候,使用委託。

可以把delegate看做乙個包含有序方法列表的物件,這些方法具有相同的簽名和返回型別。

定義乙個委託

《訪問修飾符》 delegate 《返回型別》 《委託名》 (《引數列表》)
訪問修飾符不是必須的

public delegate int mydelegate (int s);
委託的例子

using system;

namespace 委託

void printlow(int value)

- low value", value);

}void printhigh(int value)

- high value", value);}}

}

委託也可以有泛型

可以這樣例項化,委託物件必須使用new關鍵字來建立,宣告變數並建立型別的物件。

public delegate void printstring(string s);

。。。printstring ps1 = new printstring(writetoscreen);

printstring ps2 = new printstring(writetofile);

或這樣

printstring ps1;

ps1 = writetoscreen;

還可以不取名字,不單獨寫函式,如果是只需要用一次的情況,這樣可以更方便

printstring = delegate (int a)
mydel dela = myinstobj.mym1;

mydel delb = sclass.otherm2;

mydel delc = dela + delb;

**建立了三個委託,第三個委託由前兩個委託組合而成。 

委託物件可使用 "+" 運算子進行合併。乙個合併委託呼叫它所合併的兩個委託。只有相同型別的委託可被合併。"-" 運算子可用於從合併的委託中移除元件委託。

使用委託的這個有用的特點,您可以建立乙個委託被呼叫時要呼叫的方法的呼叫列表。這被稱為委託的 多播(multicasting),也叫組播。

public delegate void greeting (string name);

public static void chinesegreeting(string name)

public static void japanesegreeting(string name)

さん、こんにちは",name);

}

greetingdelegate greet;

greet = chinesegreeting;

greet += japanesegreeting;

greet ("李");

這樣會輸出

李先生你好!

李さん、こんにちは

當然用-=就會去掉,不過如果去掉本來沒在greet裡面的,比如寫greet -= englishgreeting也不會報錯

using system;

namespace 委託

", del());}}

class myclass

public int add2()

}}//結果為12

下面的效果一樣

using system;

namespace 委託

; mydel del1 = (int x) =>

;mydel del2 = (x) =>

;mydel del3 = x =>

;mydel del4 = x => x + 1;}}

}

lambda表示式和委託的小例子

using system;

public int plus2(int a, int b) => a + b;

public void plus3(int a, int b) => console.writeline(a + b);

public delegate int delelambdaempty();

public delegate int delelambdaone(int a);

public delegate int delelambdatwo(int a, int b);

static funcgetfunc = (p1, p2) => ;

public static functestforequality = (x, y) => x == y;

static void main()

;console.write("delelambdaempty():");

console.writeline(delelambdaempty());

delelambdaone delelambdaone = a => ;

console.write("delelambdaone():");

console.writeline(delelambdaone(1));

delelambdatwo delelambdatwo = (a,b) => ;

console.write("delelambdatwo():");

console.writeline(delelambdatwo(1,1));

console.write("testforequality(1,2):");

console.writeline(testforequality(1, 2));

var c = getfunc(example.plus1(1, 2).tostring(), example.plus1(3, 4).tostring());

console.write("getfunc():");

console.writeline(c);

console.readkey();}}

}

C 學習筆記之委託

委託 委託 delegate 是一種儲存函式引用的型別。就和c中的函式指標差不多。委託的宣告非常類似於函式,但不帶函式體,且要使用delegate關鍵字。委託的宣告指定了個返回型別和乙個引數列表。定義了委託後,就可以宣告該委託型別的變數。接著把這個變數初始化為與委託具有相同返回型別和引數列表的函式引...

C 學習筆記之泛型委託

求陣列的最大值 普通委託寫法如下 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 求陣列的最大值 匿名函式...

C 「委託」學習筆記

using system using system.collections.generic using system.linq using system.text namespace delegatetest console.writeline sh3 jiang 組合委託,此時委託就能夠依次執行多...