委託和事件這兩天重新溫習了一下關於委託和事件方面的知識,總結一下。
一.委託
委託就是能夠將方法作為變數來傳遞。
c#中使用委託的具體步驟是:
(1)委託的宣告。其引數形式一定要和想要包含的方法的引數形式一致。委託可以在程式執行時呼叫不同的方法,只要這個方法簽名和委託簽名保持一致。
格式:[修飾符] delegate 返回型別 委託號(引數列表)
例如:
public宣告乙個委託的物件,與宣告乙個普通類物件的方式一樣。delegate
void mydelegate1(string
input);//無返回值 有引數
public
delegate
double mydelegate2();//無引數
myclass1 cls = new委託名 委託物件;myclass1();
mydelegate1 d1;
d1 = new
mydelegate1(cls.dmethod1);
mydelegate1 d2 = new
mydelegate1(d1);
mydelegate2 d3 = new mydelegate2(cls.dmethod3);
(2)定義所有要定義的方法,其引數形式和第一步中宣告的委託物件的引數形式必須相同。
定義委託相對應的方法:
public(3)建立委託物件(將上面寫的方法包含其中)void dmethod1(string
input)
",input);
}public
void dmethod2(string
input)
",input);
}public
double
dmethod3()
view code
1 myclass1 cls=new myclass(); //(4)通過委託物件呼叫包含在其中的方法例項化物件
23 mydelegate d1=new
mydelegate(cls.dmethod1);
45 mydelegate d2=new
mydelegate(cls.dmethod2);
67 mydelegate d3=new mydelegate(cls.dmethod3);
d1("你好"詳細例項:);d2(
"生活著,學習著!");
double dbtemp=d3();
class二.事件myclass1
",input);
}public
void dmethod2(string
input)
",input);
}public
double
dmethod3()
}class
program
}
(1)事件的宣告
事件是類成員,以關鍵字event宣告。
格式:[修飾符] event 委託名 事件名;
所有的事件是通過委託來啟用的,其返回值型別一般是void型。
例子: delegate void myeventhandler();
class(2)事件的預定與取消myevent
事件的預定就是向委託的呼叫列表中新增方法,是通過事件加上運算子+=來實現的。
格式:事件名+=new 委託名(方法名);
例如:
myevent evt=new在winform窗體中myevent();
evt.active+=new eventhandler(handler);
okbutton.click+=new eventhandler(okbutton.click);只要事件被觸發,所預定的方法就會被呼叫。
事件的取消
格式:事件名 -=new 委託名(方法名);
okbutton.click-=new eventhandler(okbutton.click);對於事件的操作只能使用+=和-=這兩種運算子。
(3)事件的發生
事件的發生就是對事件相對應的委託的呼叫,也就是委託的呼叫列表中包含的各個方法的呼叫。
格式:事件名(引數);
詳細例項:
using委託的常用格式:system;
using
system.collections.generic;
using
system.linq;
using
system.text;
namespace
_02委託和事件01}}
static
void
handler()
static
void main(string
args)}}
delegate void 委託名(object sender,eventargs e);
總結一下:委託是乙個引用方法的物件,當建立乙個委託,也就建立了乙個引用方法的物件,進而就可以呼叫那個方法,即委託可以呼叫它所預定的方法。委託是對方法的抽象,它將方法的呼叫與實現分離,方法的呼叫者(即委託的執行者)不知道方法的內部如何實現,而方法的實現者也不知道什麼時候被呼叫,委託理所當然成為實現事件的機制。
錯誤或者不當之處望各位大神指點
《續》先簡要說一下obsever設計模式
observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。
classprogram
classheater
}protected
virtual
void
onboiled(boiledeventargs e)
}public
void
boilwater()}}
}
classalarm
--",heater.area ,heater.type);
console.writeline(
"alarm:嘀嘀,水已經度了
",e.temperature);
console.writeline();}}
classdisplay
--",heater.area,heater.type);
console.writeline(
"display:水快燒開了,當前溫度為:度
",e.temperature);
console.writeline();}}
關於委託和事件的示例(原創)
關於委託和事件,許多高手都已經對此進行了很詳盡的描述,昨晚突然想到乙個情景,於是今天寫了這個委託和事件的例子出來,純粹是為了練習一下,也希望這篇隨筆對您有幫助!情景大概是這樣的 有乙個老師,他教好幾個班級,然後每次考試後,他都會小小懲罰成績低於幾個班級成績的平均分的同學,同學們自然會很怕受罰啊,考完...
委託和事件
主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...
委託和事件
委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...