我對委託與事件的理解

2021-06-05 10:22:17 字數 3528 閱讀 9156

以下是我對於委託與事件的理解,如果有理解不到位的地方,請各位朋友幫忙指正,謝謝!

一、委託

1 定義

拋開書上的意義,委託其實就是方法的**。

事例:比如你需要讓3個人,每個人分別去做某一件事情,但此時你有這三個人的**人(即這三個人的主管或者上司),只需要做的事情就是告訴這個**人這三個人分別要做的事情,之後這個**人便會自動地分別告訴這三個人應該去做什麼事情。

委託是一種型別,它可以定義在類的內部,也可以定義在類的外部,其關鍵字為:delegate.

2 使用

關於委託的使用,只需要記住以下的步驟即可:

① 宣告乙個委託;

② 定義乙個委託變數;

③ 為該委託變數指定其需要「**」的方法;

④ 執行該委託

事例:比如現在你有三颱印表機(生活中乙個人大概不會同時使用三颱,此處只是做為事例說明)a,b,c,每個印表機只有乙個方法,即列印,如下:

class printa

}class printb

}class printc

}

//第一步:宣告委託(注:委託其實是一種與"類"平行的概念,它可以在類的內部宣告,也可以在類的外部宣告,如同類一樣,在使用類之前你得先建立乙個類)

public delegate void printpaintdelegate();

其次,你得定義乙個委託變數(注:此處可以想到類,乙個類在你使用的時候,首先得new乙個出來,此處我們就是「new」乙個委託)

//第二步:定義委託變數

public printpaintdelegate ppaintdelegate;

接下來,你得為你的委託定義新增刪除方法(注:委託其實是一種**,要想**,需要為其提供要**的方法)

//第三步:將想要通過委託呼叫的方法傳遞給該委託變數,可以傳遞給委託多個方法

//新增方法

public void add(printpaintdelegate ppd)

//移除某個方法

public void remove(printpaintdelegate ppd)

關於第三步,為委託新增刪除方法,該方法必須與該委託的引數個數,引數型別,引數型別及返回值一樣,否則編譯不能通過,另外,此處的add與remove方法並非必須,也可以直接通過 ppaintdelegate += ppd;或ppaintdelegate -= ppd;新增刪除方法,這個隨大家的意願。

//初始化相關的變數

printa pa=new printa();

printb pb=new printb();

printc pc=new printc();

//定義控制項器

controller col = new controller();

//為控制器新增方法

col.add(pa.printapaint);

col.add(pb.printbpaint);

col.add(pc.printcpaint);

//執行委託

col.ppaintdelegate();

console.readline();

在執行該程式後,輸出結果如下:

a號印表機在列印

b號印表機在列印

c號印表機在列印

關於執行委託的一點說明:執行委託與執行方法的操作是一致的,有參則傳參,無參則不需要引數。

最後再說一點,委託的出現就是為了事件而服務的,它的主要應用目前我知道的就是事件,所以你當你再問「委託主要是幹什麼用的問題」的時候,就默默地在心理回答:「它的出現就是為了事件而服務的」,:-),以上是對於委託的理解。

二、事件

事件是一種特殊的委託,關於事件的使用,與委託的使用沒有太多的區別,其步驟如下:

① 宣告乙個委託;

② 定義乙個事件變數;

③ 為該委託變數指定其需要「**」的方法;

④ 執行該事件

事例,我們還使用剛剛定義的印表機的事件,關於印表機的具體列印方法在此處不再多說,只說乙個控制器類,直接上**:

//委託相關的操作

//第一步:宣告委託

public delegate void printpaintdelegateevent();

//第二步:定義事件變數

public event printpaintdelegateevent ppaintdelegateevent;

//第三步:將想要通過委託呼叫的方法傳遞給該委託變數,可以傳遞給委託多個方法

//新增方法

public void add(printpaintdelegateevent ppd)

//移除某個方法

public void remove(printpaintdelegateevent ppd)

//執行方法

public void run()

注意,此處中的第二步裡,在定義的委託變數時,增加了關鍵字,even,此為委託與事件的區別之一,再看我們的main方法:

//初始化相關的變數

printa pa = new printa();

printb pb = new printb();

printc pc = new printc();

//定義控制器

controller col = new controller();

//為控制器新增方法

col.add(pa.printapaint);

col.add(pb.printbpaint);

col.add(pc.printcpaint);

//刪除某個委託中的方法

col.remove(pb.printbpaint);

//事件不能如委託一樣在外部呼叫,即不能如下呼叫,即便該方法是public的

//只能在定義該事件的類的內部呼叫,**如下:

col.run();

console.readline();

在該main方法中,與上乙個委託事例中不同的地方在於,執行事件的時候,不能通過col.ppaintdelegate();執行,而只能在定義該事件的類的內部呼叫該事件(委託),這個是事件與委託的區別之二。

可以這樣理解,事件就是一種只能在定義該事件的類的內部執行的一種特殊的委託。

乙個委託變數,如果是pulbic的,比如上邊的ppaintdelegate,可以在控制器類的內部呼叫,也可以在類的內部呼叫,但不知道大家想過沒想過乙個問題,如果某個人不小在該控制項器類內部,初始化該類的時候,直接為該委託變數直接增加了該控制器內定義的乙個私有方法,然後在main方法中執行,那麼此時,該類內部的私有方法,還如何私有呢?而事件的出現,正在為了彌補這缺點的,我想大家應該明白是怎麼回事了。

以上是我對這二者的理解,請各位看一下**有不對的地方,以便於進一步的改正,謝謝!

我對委託 事件委託的一點理解

1.宣告關於事件的委託 public delegate void alarmeventhandler object sender,eventargs e 以上,宣告乙個委託,類似c語言中宣告乙個函式指標的型別,這個型別說明了 由它去宣告的指標 所指向的函式 的引數型別和返回型別。2.宣告事件 委託 ...

對C 委託及事件委託的理解

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...

對委託和事件的理解和抽象

對委託和事件的理解和抽象 委託的理解 現實生活中的 委託,乙個物件讓另乙個物件,做乙個前者應該做的事 我委託你去幫我買瓶水 程式中 定義兩個概念 都是以物件形式存在 應用 對事件的理解 現實生活中的 事件就是乙個物件的乙個行為 某個人做了某件事 或者乙個人做了幾件事,這裡特指乙個物件乙個事件 程式中...