我看委託 三

2022-07-27 07:15:15 字數 2672 閱讀 2095

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。今天剛剛看了 霍元甲 回來,看完了,有些惆悵,想不到,所...