上述為官方說法,理解起來比較難,舉個生活中的例子:
如何呼叫委託
用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 高階程式設計 第七版 這本書都提到乙個例子 在物件的排序演算法中,需要對物件進行比較,而不同物件比較的方法不...