理解委託 delegate 及為什麼要使用委託

2022-01-18 14:40:24 字數 3375 閱讀 7209

上述為官方說法,理解起來比較難,舉個生活中的例子:

如何呼叫委託

用new關鍵字(將方法名作為引數)生成乙個委託物件,建立委託與方法的關聯。

getvalue obj = new getvlaue(class.getvalue1);

obj(3); --> result: 3

getvalue obj = new getvlaue(class.getvalue2);

obj(3); --> result: 6

getvalue obj = new getvlaue(class.getvalue3)

obj(3); --> result: 9

通過委託呼叫不同的方法,將需要執行的方法作為委託的引數

我們還可以實現多路廣播委託,什麼是多路廣播委託,看例子:

getvalue obj = new getvlaue(class.getvalue1);

obj += new getvlaue(class.getvalue2);

obj += new getvlaue(class.getvalue3);

多路廣播委託即:一處呼叫委託,所有關聯方法都會被呼叫。

委託的好處

1.相當於用方法作為另一方法引數(類似於c的函式指標)

2.在兩個不能直接呼叫的方法中作為橋梁,如:在多執行緒中的跨執行緒的方法呼叫就得用委託

3.當不知道方法具體實現什麼時使用委託,如:事件中使用委託

附:.net framework中對委託進行了封裝,直接使用func<>來代替delegate,func<>最多有四個引數的過載。

new:

我把委託理解為:委託是一種方法的格式,當然他也是一種型別。

只要是方法的格式跟委託定義的格式是一樣的,那麼就可以把該方法附加給該委託。看以下demo

宣告委託:

public delegate void add(int a,int b );
宣告乙個格式相同的方法:

static void othermethod(int a ,int b)

給類宣告乙個委託型別的成員變數

public class person    

public string age

public add myadd ;

}

將方法附加給委託,呼叫,測試如下:

static voidmain(string args)

控制台輸出—— 15

如果我們定義的othermethod不常用,就沒有必要單獨宣告乙個方法。可以用匿名方法,即:在給委託附加方法的時候,直接構造乙個跟委託格式相同的匿名方法就可以了:

寫法如下:

p1.myadd = delegate(inta, int b) ;

匿名方法,顧名思義,沒有方法名,只有方法引數和方法的演算法,可真是夠簡單了。

同樣我們也可以直接用lamuda表示式,直接構造乙個方法,如下:

p1.myadd = (int a, int b) => ;
匿名方法和拉姆達表示式的出現,使得寫方法變得更加簡便了。

上述為官方說法,理解起來比較難,舉個生活中的例子:

如何呼叫委託

用new關鍵字(將方法名作為引數)生成乙個委託物件,建立委託與方法的關聯。

getvalue obj = new getvlaue(class.getvalue1);

obj(3); --> result: 3

getvalue obj = new getvlaue(class.getvalue2);

obj(3); --> result: 6

getvalue obj = new getvlaue(class.getvalue3)

obj(3); --> result: 9

通過委託呼叫不同的方法,將需要執行的方法作為委託的引數

我們還可以實現多路廣播委託,什麼是多路廣播委託,看例子:

getvalue obj = new getvlaue(class.getvalue1);

obj += new getvlaue(class.getvalue2);

obj += new getvlaue(class.getvalue3);

多路廣播委託即:一處呼叫委託,所有關聯方法都會被呼叫。

委託的好處

1.相當於用方法作為另一方法引數(類似於c的函式指標)

2.在兩個不能直接呼叫的方法中作為橋梁,如:在多執行緒中的跨執行緒的方法呼叫就得用委託

3.當不知道方法具體實現什麼時使用委託,如:事件中使用委託

附:.net framework中對委託進行了封裝,直接使用func<>來代替delegate,func<>最多有四個引數的過載。

new:

我把委託理解為:委託是一種方法的格式,當然他也是一種型別。

只要是方法的格式跟委託定義的格式是一樣的,那麼就可以把該方法附加給該委託。看以下demo

宣告委託:

public delegate void add(int a,int b );
宣告乙個格式相同的方法:

static void othermethod(int a ,int b)

給類宣告乙個委託型別的成員變數

public class person    

public string age

public add myadd ;

}

將方法附加給委託,呼叫,測試如下:

static voidmain(string args)

控制台輸出—— 15

如果我們定義的othermethod不常用,就沒有必要單獨宣告乙個方法。可以用匿名方法,即:在給委託附加方法的時候,直接構造乙個跟委託格式相同的匿名方法就可以了:

寫法如下:

p1.myadd = delegate(inta, int b) ;

匿名方法,顧名思義,沒有方法名,只有方法引數和方法的演算法,可真是夠簡單了。

同樣我們也可以直接用lamuda表示式,直接構造乙個方法,如下:

p1.myadd = (int a, int b) => ;
匿名方法和拉姆達表示式的出現,使得寫方法變得更加簡便了。

我理解的委託 delegate

2 主體內申明使用 的方法 public void myfunction 被附體的 申明 被附體的方法 準備二 1 主體外寫準備附體的方法,上面申明的引數和返回值一致 private void 準備附體的方法1 int inttemp 你也可以這樣申明 private void 準備附體的方法2 i...

C 我理解的委託Delegate

一直以為委託很難,可能是自己太菜,覺得很不好理解。直到我今天需要將方法作為乙個引數傳遞,我才有興趣去看委託怎麼用。先說定義 委託是使用者自定義的類,它定義了方法的型別。儲存的是一系列具有相同引數和返回型別方法的位址列表,呼叫委託時,此委託列表的所有方法都將被執行。我理解的很直白的說,委託就是乙個中間...

C 中委託 delegate 和多播委託的理解

委託是定址方法的.net版本。在c 高階程式設計 第七版 中這是對委託的第一句描述。什麼是定址方法?簡單理解為我們通過委託傳遞乙個方法給另乙個方法。什麼時候需要傳遞方法?在微軟的官方文件和c 高階程式設計 第七版 這本書都提到乙個例子 在物件的排序演算法中,需要對物件進行比較,而不同物件比較的方法不...