以下是我對於委託與事件的理解,如果有理解不到位的地方,請各位朋友幫忙指正,謝謝!
一、委託
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.委託相當...
對委託和事件的理解和抽象
對委託和事件的理解和抽象 委託的理解 現實生活中的 委託,乙個物件讓另乙個物件,做乙個前者應該做的事 我委託你去幫我買瓶水 程式中 定義兩個概念 都是以物件形式存在 應用 對事件的理解 現實生活中的 事件就是乙個物件的乙個行為 某個人做了某件事 或者乙個人做了幾件事,這裡特指乙個物件乙個事件 程式中...