第十章-委托與事件_第1頁
第十章-委托與事件_第2頁
第十章-委托與事件_第3頁
第十章-委托與事件_第4頁
第十章-委托與事件_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第十章委托與事件委托(委托(delegatedelegate)是一種引用方法的類型??梢詫ⅲ┦且环N引用方法的類型??梢詫⒁粋€或多個方法分配給委托對象,該對象就與分配一個或多個方法分配給委托對象,該對象就與分配的方法具有完全相同的行為。事件是一種特殊類型的方法具有完全相同的行為。事件是一種特殊類型的委托。因為在幾乎所有的的委托。因為在幾乎所有的windowswindows應(yīng)用程序中,應(yīng)用程序中,都會涉及大量的異步調(diào)用,比如響應(yīng)按鈕點擊、處都會涉及大量的異步調(diào)用,比如響應(yīng)按鈕點擊、處理理windowswindows系統(tǒng)消息等,這些異步調(diào)用都需要通過系統(tǒng)消息等,這些異步調(diào)用都需要通過事件的方式來完成

2、。所謂事件,就是由某個對象發(fā)事件的方式來完成。所謂事件,就是由某個對象發(fā)出的消息,這個消息標(biāo)志著某個特定的行為發(fā)生了,出的消息,這個消息標(biāo)志著某個特定的行為發(fā)生了,或者某個特定的條件成立了。比如,用戶點擊了鼠或者某個特定的條件成立了。比如,用戶點擊了鼠標(biāo)、按下了某個按鈕等。標(biāo)、按下了某個按鈕等。10.110.1委托委托.1定義和使用方法定義和使用方法.2組合組合委托委托10.1.310.1.3匿名匿名方法方法10.1.410.1.4泛型泛型委托委托10.210.2事件.1委托的發(fā)布和訂閱委托的發(fā)布和訂閱.2事件的發(fā)

3、布和事件的發(fā)布和訂閱訂閱10.2.310.2.3使用使用EventHandlerEventHandler類類10.1 委托在C#中,委托的作用是這樣定義的:委托是C#語言中的一種類型,它類似于C或C+中的函數(shù)指針。委托可以將方法引用封裝在委托對象內(nèi)。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時知道將調(diào)用哪個方法。與C或C+中的函數(shù)指針不同的是,委托是面向?qū)ο?、類型安全的,并且是安全的?0.1.1定義和使用委托使用委托前必須先對其進(jìn)行定義。委托類型的定義和方法的定義相似,但不帶方法體,形式如下:訪問權(quán)限修飾符 delegate 返回值類型 委托名稱(參數(shù)列表)其中,返回值類

4、型和參數(shù)列表組成委托的簽名,委托對象只能引用與其簽名匹配的方法。例如:public delegage void DelegateFun(int x, int y);就定義了一個名為DelegateFun的委托類型,該類型用于引用具有兩個int型參數(shù)且無返回值的方法。委托對象的創(chuàng)建和一般對象的創(chuàng)建相似,形式如下: 委托類型 委托對象名 或 委托類型 委托對象名 = new 委托類型(方法名) 如委托類型DelegateFun需要引用方法fun1,其調(diào)用形式如下:DelegateFun fun;fun = new DelegateFun(fun1);或DeleageFun fun = new De

5、legateFun(fun1);創(chuàng)建委托對象后,就可以直接使用該委托對象,對該對象的調(diào)用同調(diào)用該對象所引用的方法本身完全一致。 【例【例10-1】 定義和使用委定義和使用委class _10_1public static void Main(string args)/ 聲明委托變量聲明委托變量DelegateFun fun;int x = 4, y = 2;/ 方法方法fun1作為變量傳遞給委托對象作為變量傳遞給委托對象funfun = new DelegateFun(fun1);/ 委托調(diào)用委托調(diào)用fun(x, y);/ 方法方法fun2作為變量傳遞給委托對象作為變量傳遞給委托對象funfu

6、n = new DelegateFun(fun2);fun(x, y);/ 方法方法fun3作為變量傳遞給委托對象作為變量傳遞給委托對象funfun = new DelegateFun(fun3);fun(x, y);Console.ReadLine();public static void fun1(int x, int y)Console.WriteLine(x+y=0, x + y); public static void fun2(int x, int y)Console.WriteLine(x-y=0, x - y); public static void fun3(int x, i

7、nt y)Console.WriteLine(x*y=0, x * y);【例【例10-2】 引用實例方法引用實例方法class MethodClasspublic void fun1(int x, int y)Console.WriteLine(x+y=0, x + y); public void fun2(int x, int y)Console.WriteLine(x-y=0, x - y); public void fun3(int x, int y)Console.WriteLine(x*y=0, x * y);class _10_2public static void Main(s

8、tring args)/ 聲明委托變量聲明委托變量 DelegateFun fun; int x = 4, y = 2; MethodClass mc = new MethodClass(); / 實例方法實例方法fun1作為變量傳遞給委托對象作為變量傳遞給委托對象fun fun = new DelegateFun(mc.fun1); / 委托調(diào)用委托調(diào)用 fun(x, y); / 實例方法實例方法fun2作為變量傳遞給委托對象作為變量傳遞給委托對象fun fun = new DelegateFun(mc.fun2); fun(x, y); / 實例方法實例方法fun3作為變量傳遞給委托對象作

9、為變量傳遞給委托對象fun fun = new DelegateFun(mc.fun3); fun(x, y); Console.ReadLine();10.1.2組合委托前面的委托對象每次都只引用一個方法,實際上,一個委托對象可以同時引用多個方法,如果需要給某個委托對象同時分配多個方法,只需要使用加法運算符“+”;如果需要從某個委托對象中移除某個它已經(jīng)引用的方法,只需要使用減法運算符“-”。修改例修改例10-1中的中的Main函數(shù)部分如下:函數(shù)部分如下:public static void Main(string args)/ 聲明委托變量聲明委托變量DelegateFun fun;int

10、x = 4, y = 2;/ 方法方法fun1作為變量傳遞給委托對象作為變量傳遞給委托對象funfun = new DelegateFun(fun1);/ 方法方法fun2作為變量添加給委托對象作為變量添加給委托對象funfun = fun + new DelegateFun(fun2);/ 方法方法fun3作為變量添加給委托對象作為變量添加給委托對象funfun += new DelegateFun(fun3);fun(x, y);/ 從委托對象中移除方法從委托對象中移除方法fun1fun -= fun1Console.ReadLine();10.1.3匿名方法C#2.0引入了匿名方法,所謂

11、的匿名方法是指不指定單獨的方法,而是將方法的執(zhí)行代碼直接封裝在委托對象中。如果某個方法只是通過委托對象來調(diào)用,程序中不會直接調(diào)用它,那么,定義匿名方法是最佳選擇。可以把匿名方法想象為一個實現(xiàn)與委托進(jìn)行關(guān)聯(lián)這項功能的便捷途徑。當(dāng)編譯器碰到匿名方法的時候,它會自動在類里面創(chuàng)建一個命名方法,并將它與委托進(jìn)行關(guān)聯(lián)。所以匿名方法在運行期間與命名方法的性能非常類似,使用匿名方法的作用是提高開發(fā)人員的開發(fā)效率上,而不是運行期間的執(zhí)行上。【例【例10-3】 匿名方法匿名方法 class _10_3 public static void Main(string args) DelegateFun fun; /

12、匿名封裝方法到委托對象匿名封裝方法到委托對象 fun = delegate(int x, int y) Console.WriteLine(x+y=0, x + y); ; fun += delegate(int x, int y) Console.WriteLine(x-y=0, x - y); ; fun += delegate(int x, int y) Console.WriteLine(x*y=0, x * y); ; fun(5, 3); Console.ReadLine(); 【例【例10-4】 匿名方法和命名方法處理外部變量的差異匿名方法和命名方法處理外部變量的差異 class

13、 _10_4 public static void Main(string args) DelegateFun fun;int x = 0;/ 封裝命名方法到委托對象封裝命名方法到委托對象fun = new DelegateFun(Increment);Console.WriteLine(第一次調(diào)用委托(命名方法)第一次調(diào)用委托(命名方法)x=0, fun(x);Console.WriteLine(第一次調(diào)用委托(命名方法)后外第一次調(diào)用委托(命名方法)后外部變量部變量x=0, x);Console.WriteLine(第二次調(diào)用委托(命名方法)第二次調(diào)用委托(命名方法)x=0, fun(x)

14、;Console.WriteLine(第二次調(diào)用委托(命名方法)后外第二次調(diào)用委托(命名方法)后外部變量部變量x=0, x); / 匿名封裝方法到委托對象匿名封裝方法到委托對象 fun = delegate(int x) return +x; ;Console.WriteLine(第一次調(diào)用委托(匿名方法)第一次調(diào)用委托(匿名方法)x=0, fun(x);Console.WriteLine(第一次調(diào)用委托(匿名方法)后外第一次調(diào)用委托(匿名方法)后外部變量部變量x=0, x);Console.WriteLine(第二次調(diào)用委托(匿名方法)第二次調(diào)用委托(匿名方法)x=0, fun(x);Con

15、sole.WriteLine(第二次調(diào)用委托(匿名方法)后外第二次調(diào)用委托(匿名方法)后外部變量部變量x=0, x); Console.ReadLine(); public static int Increment(int x)return +x; 10.1.4泛型委托C#2.0之后,為了提高代碼的適用性,我們可以在程序中使用泛型,那泛型能不能用在委托中呢?答案是肯定的。泛型委托是委托的一種特殊形式,在使用的時候跟單純的委托類似,不過泛型委托更具有類型通用性。它融合了泛型和委托的抽象能力,又不失靜態(tài)類型的安全性。泛型委托的定義形式如下:訪問權(quán)限修飾符 delegate 返回值類型 委托名稱(參

16、數(shù)列表)其中,參數(shù)列表類型可以根據(jù)泛型的定義進(jìn)行設(shè)置。例如:public delegage void DelegateFun(T x, T y);【例【例10-5】 泛型委托泛型委托 class MethodClass public void fun1(string x, string y) Console.WriteLine(x+y=0, x + y); public void fun2(int x, int y) Console.WriteLine(x-y=0, x - y); public void fun3(int x, int y) Console.WriteLine(x*y=0,

17、x * y); class _10_5 public static void Main(string args) MethodClass mc = new MethodClass(); / 方法方法fun1作為變量傳遞給委托對象作為變量傳遞給委托對象fun DelegateFun fun = new DelegateFun(mc.fun1); / 委托調(diào)用委托調(diào)用 fun(Hello , World!); / 方法方法fun2作為變量傳遞給委托對象作為變量傳遞給委托對象Fun DelegateFun Fun = new DelegateFun(mc.fun2); Fun(5, 3); / 方法

18、方法fun3作為變量傳遞給委托對象作為變量傳遞給委托對象Fun Fun = new DelegateFun(mc.fun3); Fun(5, 3); Console.ReadLine(); 10.2事件事件(event)是一種特殊類型的委托,是類在發(fā)生其關(guān)注的事情時用來提供通知的一種方式。事件的發(fā)生一般都涉及到事件發(fā)布者(Publisher)和事件訂閱者(Subscriber)兩個個角色。在掌握事件之前必須先了解兩個概念。事件發(fā)布者(Publisher):一個事件的發(fā)布者(sender),其實就是個對象,這個對象會自行維護(hù)本身的狀態(tài)信息,當(dāng)本身狀態(tài)信息變動時,便觸發(fā)一個事件,并通知說有的事件訂

19、閱者。事件訂閱者(Subscriber):對事件感興趣的對象(Receiver),可以注冊感興趣的事件,在事件發(fā)布者觸發(fā)一個事件后,會自動執(zhí)行這段代碼。10.1.3委托的發(fā)布和訂閱1字符串比較委托能封裝方法,而且能夠合并或刪除其他委托對象,因而能夠通過委托來實現(xiàn)“發(fā)布者/訂閱者”的設(shè)計模式。在討論事件之前我們先分析委托的發(fā)布和訂閱,其具體實現(xiàn)步驟如下:定義委托類型,并在發(fā)布者類中定義一個該類型的共有成員。在訂閱者類中定義委托處理方法。訂閱者對象將其事件處理方法和合并到發(fā)布者對象的委托成員上。發(fā)布者對象在特定的情況下激發(fā)委托操作,從而自動調(diào)用訂閱者對象的委托處理方法。以交通紅綠燈為例,車輛必須對

20、交通燈的顏色變化作以交通紅綠燈為例,車輛必須對交通燈的顏色變化作出響應(yīng)(紅燈停,綠燈行)。先定義一個委托類型出響應(yīng)(紅燈停,綠燈行)。先定義一個委托類型LightEventLightEvent,其參數(shù),其參數(shù)colorcolor表示交通燈顏色(表示交通燈顏色(boolbool類類型,紅燈為型,紅燈為truetrue,綠燈為,綠燈為falsefalse)。)。public delegate void LightEvent(bool public delegate void LightEvent(bool color);color);紅綠燈的顏色變化會改變車輛的形式狀態(tài),因此紅綠紅綠燈的顏色變化會

21、改變車輛的形式狀態(tài),因此紅綠燈是事件的發(fā)布者,車輛是訂閱者。定義交通燈類燈是事件的發(fā)布者,車輛是訂閱者。定義交通燈類TrafficLightTrafficLight,將前面定義的委托類型進(jìn)行發(fā)布,并,將前面定義的委托類型進(jìn)行發(fā)布,并將其成員方法將其成員方法ChangeColorChangeColor定義為事件觸發(fā)方法。定義為事件觸發(fā)方法。 public class TrafficLight public class TrafficLight private bool color = false; private bool color = false; public bool Color get

22、return color; public bool Color getreturn color; public LightEvent OnColorChange; / public LightEvent OnColorChange; / 發(fā)布委托發(fā)布委托 / / 觸發(fā)事件方法觸發(fā)事件方法 public void ChangeColor() public void ChangeColor() color = !color; color = !color; Console.WriteLine(color ? Console.WriteLine(color ? 紅燈紅燈 : : 綠燈綠燈);); /

23、 / 判斷事件是否注冊,已注冊則調(diào)用委托判斷事件是否注冊,已注冊則調(diào)用委托 if (OnColorChange != null) if (OnColorChange != null) OnColorChange(color); OnColorChange(color); 車輛是訂閱者,定義車輛類Car,在車輛類中對委托進(jìn)行訂閱。 public class Car / 車輛行駛狀態(tài),行駛為true,停止為false private bool isRun = true; / 委托處理方法方法 public virtual void LightColorChange(bool color) / 紅燈

24、亮,并且正在行駛 if (isRun & color) isRun = false; Console.WriteLine(0停車, this); / 綠燈亮,并且已經(jīng)停止 else if(!isRun & !color) isRun = true; Console.WriteLine(0啟動, this); / 訂閱者對發(fā)布的事件進(jìn)行訂閱,將委托處理方法注冊到委托中 public void Enter(TrafficLight light) light.OnColorChange += LightColorChange; 當(dāng)TrafficLight對象使用其ChangeColo

25、r方法改變交通燈顏色時,就會自動調(diào)用相關(guān)Car對象的LightColorChange方法,例如: TrafficLight light = new TrafficLight(); Car car1 = new Car(); car1.Enter(light); light.ChangeColor();/ 事件發(fā)生,car1隨之響應(yīng) light.ChangeColor();/ 事件再次發(fā)生,car1隨之響應(yīng)這種模式下,一個發(fā)布者可以對應(yīng)多個訂閱者對象,這些對象還可以屬于不同的類,并采用不同的委托處理方法。比如對于救護(hù)車類Ambulance,它在一般情況下采用與基類Car相同的響應(yīng)方式,但在緊急情

26、況下(Emergent屬性為true)允許闖紅燈。 public class Ambulance : Car public class Ambulance : Car / / 緊急事件緊急事件 private private boolbool emergent = false; emergent = false; public public boolbool Emergent Emergent get get return emergent; return emergent; set set emergent = value; emergent = value; / / 重寫委托處理方法方法重

27、寫委托處理方法方法 public override void public override void LightColorChangeLightColorChange( (boolbool color) color) if (emergent) if (emergent) Console.WriteLineConsole.WriteLine(0(0救人要緊救人要緊, this);, this); else else base.LightColorChangebase.LightColorChange(color);/ (color);/ 非緊急狀況下使用基類處理方法非緊急狀況下使用基類處理方

28、法 在不需要的情況下,訂閱者可以通過委托刪除來取消訂閱。例如,Car類可以通過如下方法來取消對交通燈的響應(yīng)。 public void Leave(TrafficLight light) light.OnColorChange -= LightColorChange; 委托可以進(jìn)行發(fā)布和訂閱,從而使不同的對象對特定的情況作出反應(yīng)。但這種機制存在一個問題,即外部對象可以覆蓋已經(jīng)發(fā)布的委托,這就會影響到其他對象對委托的訂閱。比如,一個新車輛類Truck(卡車)也可以訂閱TrafficLight的OnColorChange委托,但他沒有在訂閱事件中使用“+”(或“+=”)操作符,而是直接使用了賦值操作

29、符“=”: light.OnColorChange = LightColorChange;當(dāng)某些Car對象完成訂閱后,Truck對象再進(jìn)行訂閱時,Car對象的所有訂閱會被Truck對象的訂閱所覆蓋,TrafficLight對象的OnColorChange委托將只調(diào)用最后一個Truck對象的LightColorChange方法。當(dāng)交通燈顏色發(fā)生變化時,其他對象將不會作出響應(yīng)。10.2.2事件的發(fā)布和訂閱為了解決這個問題,C#提供了專門的時間發(fā)布方式,其做法是在發(fā)布者類發(fā)布的委托定義中加上event關(guān)鍵字,將委托發(fā)布強制為事件發(fā)布:public event LightEvent OnColorCh

30、ange; / 發(fā)布事件經(jīng)過這一見到修改后,其他類型再使用OnColorChange委托時,必須使用復(fù)合賦值操作符“+=”或“-=”,而類似于下面的賦值代碼都不能通過編譯:light.OnColorChange = LightColorChange;/ 編譯錯誤light.OnColorChange = null;/ 編譯錯誤也就是說,事件是一種特殊的委托類型,發(fā)布者在發(fā)布一個事件之后,訂閱者對它只能進(jìn)行自身的訂閱或取消,而不能干涉其他的訂閱者?!纠纠?0-6】 事件的發(fā)布和訂閱事件的發(fā)布和訂閱 public delegate void LightEvent(bool light); / 發(fā)

31、布者(發(fā)布者(Publiser) public class TrafficLight / 紅燈紅燈true,綠燈,綠燈false private bool color = false; public bool Color get return color; / 發(fā)布事件發(fā)布事件 public event LightEvent OnColorChange; / 觸發(fā)事件方法觸發(fā)事件方法 public void ChangeColor() color = !color; Console.WriteLine(color ? 紅燈紅燈 : 綠燈綠燈); / 判斷事件是否注冊判斷事件是否注冊 if (O

32、nColorChange != null) OnColorChange(color); / 訂閱者(訂閱者(Subscriber) public class Car / 車輛行駛狀態(tài)車輛行駛狀態(tài) private bool isRun = true; / 委托處理方法委托處理方法 public virtual void LightColorChange(bool color) / 紅燈亮,并且正在行駛紅燈亮,并且正在行駛 if (isRun & color) isRun = false; Console.WriteLine(0停車停車, this); / 綠燈亮,并且已經(jīng)停止綠燈亮,并且

33、已經(jīng)停止 else if(!isRun & !color) isRun = true; set emergent = value; / 重寫委托處理方法方法重寫委托處理方法方法 public override void LightColorChange(bool color) if (emergent) Console.WriteLine(0救人要緊救人要緊, this); else base.LightColorChange(color); class _10_6 public static void Main(string args) / 實例化發(fā)布者實例化發(fā)布者 TrafficL

34、ight light = new TrafficLight(); / 實例化訂閱者實例化訂閱者 Car car1 = new Car(); / 訂閱者向發(fā)布者注冊事件訂閱者向發(fā)布者注冊事件 car1.Enter(light); Ambulance amb = new Ambulance(); amb.Enter(light); / 觸發(fā)事件觸發(fā)事件 light.ChangeColor(); light.ChangeColor(); amb.Emergent = true; light.ChangeColor(); light.ChangeColor(); Console.ReadKey();

35、在事件發(fā)布和訂閱的過程中,定義事件的原型委托類型是件重復(fù)性的工作。因此,.NET類庫中定義了一個EventHandler委托類型,并建議盡量使用該類型作為事件的原型,該委托的原型為:public delegate void EventHandler(object sender, EventArgs e);其中,第一個參數(shù)sender是object類型的,表示引發(fā)事件的對象;第二個參數(shù)從 EventArgs 類型派生,它保存事件數(shù)據(jù)。由于事件成員只能由類型本身觸發(fā),因此,在觸發(fā)時傳遞給第一個參數(shù)的值通常應(yīng)為this;如果事件不生成事件數(shù)據(jù),則第二個參數(shù)只是 EventArgs 的一個實例,否則,

36、第二個參數(shù)為從 EventArgs 派生的自定義類型,提供保存事件數(shù)據(jù)所需的全部字段或?qū)傩浴P薷陌l(fā)布者類部分代碼如下:10.2.3使用EventHandler類public event EventHandler OnColorChange;public void ChangeColor()color = !color;Console.WriteLine(color ? 紅燈 : 綠燈); if (OnColorChange != null) OnColorChange(this, null);/ 事件沒有附加信息時,第二個參數(shù)置為空事件的訂閱者可以通過sender參數(shù)來了解是哪個對象觸發(fā)的事件

37、,但是在訪問對象時要進(jìn)行拆箱轉(zhuǎn)換。例如,Car類對TrafficLight.OnColorChange事件的處理方法可以修改為:public virtual void LightColorChange(bool color)Console.WriteLine(TrafficLight)sender).color ? “停車”, “啟動”);EventHandler委托的第二個參數(shù)e表示事件中包含的數(shù)據(jù)。如果發(fā)布者還要向訂閱者傳遞額外的事件數(shù)據(jù),那么就需要定義EventArgs類的派生類。例如,要描述交通燈變化后持續(xù)的時間,可以定義如下的LightEventArgs類:public class

38、public class LightEventArgsLightEventArgs : : EventArgsEventArgs private private intint seconds; seconds;public public intint Seconds Seconds GetGet return seconds;return seconds; public public LightEventArgsLightEventArgs( (intint seconds) seconds) this.secondsthis.seconds = seconds; = seconds; 而Tr

39、afficLight在觸發(fā)OnColorChange事件時,就可以將事件數(shù)據(jù)作為參數(shù)傳遞給EventHandler委托:Public event Public event EventHandlerEventHandler OnColorChangeOnColorChange; ;public void public void ChangeColorChangeColor( (intint seconds) seconds) color = !color;color = !color;Console.WriteLineConsole.WriteLine(color ? “(color ? “紅燈

40、亮紅燈亮”, “”, “綠燈亮綠燈亮”);”);if(if(OnColorChangeOnColorChange != null) != null)OnColorChangeOnColorChange(this, new (this, new LightEventArgLightEventArg(seconds); / (seconds); / 傳遞傳遞事件數(shù)據(jù)事件數(shù)據(jù) 由于EventHandler原始定義中的參數(shù)類型是EventArgs,那么訂閱者在讀取參數(shù)內(nèi)容時同樣需要進(jìn)行拆箱轉(zhuǎn)換,然后才能讀取其中參數(shù)值,例如:Public virtual void Public virtual void

41、 LightColorChangeLightColorChange(object sender, (object sender, EventArgsEventArgs e) e)是型是型entHandlerghtEventArgentHandlerghtEventArg()()rChangerChange; ; If(If(TrafficLightTrafficLight)sender).Color)sender).Color) bRunbRun = false; = false; Console.WriteLineConsole.WriteLine(0(0停車,停車,11秒后啟動秒后啟動,

42、this, , this, (LightEventArgsLightEventArgs)e).Seconds);)e).Seconds); elseelse bRunbRun = false; = false; Console.WriteLineConsole.WriteLine(0(0啟動啟動 ,11秒內(nèi)通過秒內(nèi)通過, this, , this, (LightEventArgsLightEventArgs)e).Seconds);)e).Seconds); 【例【例10-7】 使用使用EventHandler類類public class LightEventArgs : EventArgsp

43、rivate int seconds;public int Secondsgetreturn seconds; public LightEventArgs(int seconds)this.seconds = seconds; / 發(fā)布者(發(fā)布者(Publiser)public class TrafficLight/ 紅燈紅燈true,綠燈,綠燈falseprivate bool color = false;public bool Colorgetreturn color; / 發(fā)布事件發(fā)布事件public event EventHandler OnColorChange; / 觸發(fā)事件方法觸發(fā)事件方法public void ChangeColor(int seconds)color = !color;Console.WriteLine(color ? 紅燈紅燈 : 綠燈綠燈);/ 判斷事件是否注冊判斷事件是否注冊if (OnColorChange != null)On

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論