1.委託
寫程式的時候,根據傳遞的引數,確定呼叫的是哪個函式,但我有一點疑問,委託的物件不是指向函式名,委託的引數不是和函式名的引數一樣,那麼這樣為什麼還不能確定呼叫的是哪個方法呢?
委託可以認為具有相同簽名和返回值型別的有序方法列表。
當委託被呼叫時,它呼叫方法列表中的每乙個方法。
第一步:宣告委託
delegate 返回值型別 委託型別名(引數名); 沒有方法主體
delegate void adelegate(string a);
第二步:既然委託沒有方法主體,那麼我就要宣告乙個方法主體,否則將沒有任何意義。
這個時候,就可以根據委託來進行方法的宣告。
static 返回值型別 方法名(引數名)
static void say(string a)
第三步:在程式中進行委託的呼叫
既然是進行委託的呼叫,那麼委託物件首先要指向要呼叫的方法,如果委託沒有指向任何方法名,那麼也就談不上委託對方法列表進行呼叫了。
★★★委託型別宣告委託物件如何對方法進行呼叫呢?可以有這兩種方法。
1)直接宣告乙個委託物件然後指向要呼叫的方法名即可。
adelegate adel = say;
adel("11");
2)例項化乙個委託物件,把方法名當做引數傳遞過去,然後在進行委託的呼叫。
adelegate adel = new adelegate(say);
adel("11");
2.委託如何呼叫多個方法
★★★★★上面說的是委託對方法列表中的乙個方法進行呼叫,那麼能不能對多個方法進行呼叫呢?當然是可以的了,委託的乙個特重要的目的就是對多個方法一起進行呼叫。
adelegate adel = new adelegate(say)+hellow; //進行多個方法的呼叫時,委託指向的第乙個方法必須被例項化。
adel("11");
static void say(string a)
static void hellow(string b)
delegate void adelegate(string a);
★★★★★通過上面的例子我們可以看出,委託是如何對多個方法進行呼叫的。
3.下面我們通過乙個例子,可以更進一步看出委託是如何扣窟窿的。
listlist1 = new list();
list1.add(10);
list1.add(-15);
list1.add(14);
list1.add(-8);
list1.add(6);
list1.add(3);
foreach (int i in list1)
",i);}}
foreach (int i in list1)
",i);}}
foreach (int i in list1)
",i);}}
★★★★★通過上面的例子,我們發現沒次對i進行判斷,都要進行一次迴圈宣告,如果細心點會發現,上面唯一不同的地方是if條件的判斷。
4.通過乙個winform程式引入事件的概念
(1)乙個簡單的委託在窗體間呼叫的例子
第一步:在使用者控制項中自定義乙個按鈕,宣告委託,委託的物件,當使用者點選自定義按鈕時,如果委託不為null的時候,呼叫使用者傳遞過來的委託方法。
public delegate void adelegate(); //宣告乙個委託
public adelegate adel;//宣告乙個委託物件。
private void button1_click(object sender, eventargs e)
}(2)在窗體中的建構函式中,宣告當前使用者控制項btnuser的委託指向的方法是
btnuser.adel = say;
(3)然後宣告委託呼叫的方法
void say()
5.如何進行委託的清除如偽造
對使用的控制項進行修改
btnuser.adel = null; //清除使用者控制項的委託為空null
if(btnuser.adel!=null) //如果使用者控制項的委託不為空的話
btnuser.adel(); //進行使用者控制項的冒充
★★★★★既然存在著這樣的問題,那麼如何進行保護呢,避免可能出現的清除與監聽呢?
(1)如果把宣告委託的物件改成private的話,那麼雖都無法進行訪問,這種方法,顯然是不好的。
那麼如何進行避免呢,可以有以下兩種方法,把委託宣告為私有的,在方法中進行新增委託的呼叫。
private adelegate adel;
public void ade(adelegate d)
內部使用的還是私有的委託物件。
if (adel != null)
★★★★★但外部的話,就需要通過方法傳遞呼叫列表了。
btnuser.ade(say); 使用者控制項 委託方法(呼叫列表中的方法名)
(2)使用事件來避免清除與冒充
★★★★★委託是型別,事件是用委託來實現的其實就是欄位或屬性。
event 委託型別 事件名
事件成員可以用+=、-=呼叫add、remove方法
public event sanqiangdelegate onsanqiang
remove
}★★★★★外部使用事件的時候,必須+= 或-=
btnuser.adel += say;
我看委託 一
1.委託 1 如何宣告乙個委託?delegate 返回值型別 委託型別 引數 delegate void saydelegate string s 2 委託是如何指向方法的?對方法進行呼叫 委託型別宣告的委託物件指向方法 委託物件呼叫委託的方法 看方法的引數進行呼叫 委託要呼叫方法,肯定要有方法被委...
我比較笨系列 《委託 》(三)事件
事件的由來 我們繼續思考上面的程式 上面的三個方法都定義在programe類中,這樣做是為了理解的方便,實際應用中,通常都是 greetpeople 在乙個類中,chinesegreeting和 englishgreeting 在另外的類中。現在你已經對委託有了初步了解,是時候對上面的例子做個改進了...
我看《霍元甲》
接近年關,國內的 國外的,好的 爛的。電影比平常多多啦,象我這樣的喜歡看電影的人自然是看得很爽。最近這幾個月的大片,我基本上都看了,今天看到新聞說,深圳2005年一年的電影票房有7800多萬,算一算,還真不少,估計裡面也有我貢獻的那7萬分之1。今天剛剛看了 霍元甲 回來,看完了,有些惆悵,想不到,所...