posts - 5,  comments - 5,  trackbacks - 0
          托的聲明

          public delegate void MyDelegate(string str);

          1.委托的定義和方法的定義類似,只是在前面加了一個(gè)delegate,但委托不是方法,它是一種類型。是一種特殊的類型,看成是一種新的對(duì)象類型比較好理解。用于對(duì)與該委托有相

          同簽名的方法調(diào)用。
          2.委托相當(dāng)于C++中的函數(shù)指針,但它是類型安全的。
          3.委托是從System.Delegate派生,但不能象定義常規(guī)類型一樣直接從System.Delegate派生,對(duì)委托的聲明只能通過上面的聲明格式進(jìn)行定義。關(guān)鍵字delegate通知編譯器這是一

          個(gè)委托類型,從而在編譯的時(shí)候?qū)υ擃愡M(jìn)行封裝,對(duì)這一過程C#定義了專門的語法來處理這一過程。
          4.不能從一個(gè)委托類型進(jìn)行派生,因?yàn)樗彩悄J(rèn)sealed的
          5.委托即可以對(duì)靜態(tài)方法進(jìn)行調(diào)用也可以對(duì)實(shí)例方法進(jìn)行調(diào)用。
          6.每個(gè)委托類型包含一個(gè)自己的調(diào)用列表,當(dāng)組合一個(gè)委托或從一個(gè)委托中刪除一個(gè)委托時(shí)都將產(chǎn)生個(gè)新的調(diào)用列表。
          7.兩個(gè)不同類型的委托即使它們有相同的簽名和返回值,但還是兩個(gè)不同類型的委托。但其實(shí)在使用中可看作是相同的。


          委托的比較

          C#中對(duì)委托定義了兩個(gè)操作符 == 和 !=
          在以下情況下兩個(gè)委托是相等的:
          1.當(dāng)兩個(gè)委托都同時(shí)為null的時(shí)候
          2.當(dāng)兩個(gè)委托都不為null時(shí),下列情況下是相等的。
          a.當(dāng)兩個(gè)委托的各自的調(diào)用列表只含有一個(gè)入口點(diǎn)的時(shí)候
          ?? 在下列情況下是相等的
          ?? (1) 調(diào)用同一對(duì)象的同一靜態(tài)方法
          ?? (2) 調(diào)用同一對(duì)象的同一實(shí)例方法
          b.當(dāng)兩個(gè)委托具有多個(gè)入口點(diǎn)時(shí)
          ?? 在下列情況下是相等的
          ?? (1)只有當(dāng)它們調(diào)用列表中的調(diào)用的方法按順序都一一對(duì)應(yīng)相同的對(duì)象及對(duì)象的同一方法的時(shí)候

          如上所述的兩個(gè)不同類型的委托但是它們具有相同的簽名和返回值時(shí),只要滿足上述條件的,即使它們類型不同,但比較的結(jié)果也是相同的。

          委托的異常處理

          當(dāng)調(diào)用該委托的方法中發(fā)生了異常時(shí),首先在調(diào)用該委托的方法中搜尋catch語句塊。如果沒有,則去該委托調(diào)用的方法中去尋找有沒有catch語句塊,這和調(diào)用方法發(fā)生異常的處

          理是一樣的。

          當(dāng)調(diào)用一個(gè)為null的委托即委托中列表中不存在調(diào)用方法時(shí),將發(fā)生NullRefrenceException

          委托的注意點(diǎn):
          當(dāng)一個(gè)委托有多個(gè)入口點(diǎn)的時(shí)候,調(diào)用委托將依該委托的調(diào)用列表中的方法的順序依次調(diào)用.這些方法共享一個(gè)參數(shù)集合,所以當(dāng)委托有返回值的時(shí)候調(diào)用完這個(gè)委托后的返回值是最

          后一個(gè)方法的返回值或是有out參數(shù).如果該委托的參數(shù)為ref(引用類型),那么在招待第一個(gè)方法的時(shí)候如果對(duì)這個(gè)參數(shù)的值有所改變,那么這個(gè)改變將會(huì)影響到后面的方法調(diào)用.

          委托的一個(gè)例子

          using System;
          using System.Collections.Generic;
          using System.Text;

          namespace ConsoleApplication1
          {
          ??? class Program
          ??? {
          ??????? static void Main(string[] args)
          ??????? {
          ??????????? // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類的靜態(tài)方法M1
          ??????????? MyDelegate d1 = new MyDelegate(C.M1);
          ??????????? d1("D1"); // M1

          ??????????? // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類的靜態(tài)方法M2
          ??????????? MyDelegate d2 = new MyDelegate(C.M2);
          ??????????? d2("D2"); // M2

          ??????????? // 創(chuàng)建一個(gè)委托實(shí)例,封裝C類的實(shí)例方法M3
          ??????????? MyDelegate d3 = new MyDelegate(new C().M3);
          ??????????? d3("D3"); // M3

          ??????????? // 從一個(gè)委托d3創(chuàng)建一個(gè)委托實(shí)例
          ??????????? MyDelegate d4 = new MyDelegate(d3);
          ??????????? d4("D4"); // M3

          ??????????? // 組合兩個(gè)委托
          ??????????? MyDelegate d5 = d1 + d2;
          ??????????? d5 += d3;
          ??????????? d5("D5"); // M1,M2,M3

          ??????????? // 從組合委托中刪除d3
          ??????????? MyDelegate d6 = d5 - d3;
          ??????????? d6("D6"); // M1,M2
          ??????????? d6 -= d3; // 雖然d6調(diào)用列表中已經(jīng)沒有d3了,但這樣只是不可能的移除沒有錯(cuò)誤發(fā)生
          ??????????? d6("D6"); // M1,M2
          ??????????? d6 -= d6;
          ??????????? //d6("D6"); 此時(shí)d6的調(diào)用列表為空,d6為null,所以引發(fā)System.NullReferenceException

          ??????????? MyDelegate d7 = new MyDelegate(C1.P1);
          ??????????? d7("D7"); // C1.P1

          ??????????? MyDelegate d8 = new MyDelegate(new C2().P1);
          ??????????? d8("D8"); // C2.P1

          ??????? }
          ??? }

          ??? // 聲明一個(gè)委托MyDelegate
          ??? public delegate void MyDelegate(string str);

          ??? public class C
          ??? {
          ??????? public static void M1(string str)
          ??????? {
          ??????????? Console.WriteLine("From:C.M1:?? {0}", str);
          ??????? }

          ??????? public static void M2(string str)
          ??????? {
          ??????????? Console.WriteLine("From:C.M2:?? {0}", str);
          ??????? }

          ??????? public void M3(string str)
          ??????? {
          ??????????? Console.WriteLine("From:C.M3:?? {0}", str);
          ??????? }
          ??? }

          ??? public class C1
          ??? {
          ??????? public static void P1(string str)
          ??????? {
          ??????????? Console.WriteLine("From:C1.P1:?? {0}", str);
          ??????? }
          ??? }

          ??? public class C2
          ??? {
          ??????? public void P1(string str)
          ??????? {
          ??????????? Console.WriteLine("From:C2.P1:?? {0}", str);
          ??????? }
          ??? }???
          }

          事件委托

          事件概述

          事件就是當(dāng)對(duì)象或類狀態(tài)發(fā)生改變時(shí),對(duì)象或類發(fā)出的信息或通知。發(fā)出信息的對(duì)象或類稱為"事件源",對(duì)事件進(jìn)行處理的方法稱為"接收者",通常事件源在發(fā)出狀態(tài)改變信息時(shí),它

          并不知道由哪個(gè)事件接收者來處理.這就需要一種管理機(jī)制來協(xié)調(diào)事件源和接收者,C++中通過函數(shù)指針來完成的.在C#中事件使用委托來為觸發(fā)時(shí)將調(diào)用的方法提供類型安全的封裝


          事件的聲明

          1.聲明一個(gè)委托
          public delegate void EventHandler(object sender, System.EventArgs e);

          2.聲明一個(gè)事件
          public event EventHandler Changed;

          3.引發(fā)一個(gè)事件
          public OnChanged(EnventArgs e)
          {
          ?if ( Changed != null)
          ?{
          ??Changed(this,e);
          ?}
          }

          4.定義事件處理程序
          public MyText_OnChanged(Object sender,EventArgs e)
          {
          ?...
          }

          5.訂閱事件(將事件處理程序添加到事件的調(diào)用列表中)

          myText.Changed += EventHandler(MyText_OnChanged);

          下面的一個(gè)小例子說明了怎樣定義一個(gè)完整的事件機(jī)制:

          using System;
          using System.Collections.Generic;
          using System.Text;

          namespace ConsoleApplication1
          {
          ??? class Program
          ??? {???????
          ??????? static void Main(string[] args)
          ??????? {?????????????
          ??????????? MyText myText = new MyText();

          ??????????? // 將事件處理程序添加到事件的調(diào)用列表中(即事件布線)
          ??????????? myText.Changed += new MyText.ChangedEventHandler(myText_Changed);????????
          ???????????
          ??????????? string str = "";
          ??????????? while (str != "quit")
          ??????????? {
          ??????????????? Console.WriteLine("please enter a string:");
          ??????????????? str = Console.ReadLine();
          ??????????????? myText.Text = str;
          ??????????? }
          ??????? }

          ??????? // 對(duì)Change事件處理的程序
          ??????? private static void myText_Changed(object sender, EventArgs e)
          ??????? {
          ??????????? Console.WriteLine("text has been changed? :{0}\n" ,((MyText)sender).Text);
          ??????? }???????
          ??? }?

          ??? public class MyText
          ??? {
          ??????? private string _text = "";

          ??????? // 定義事件的委托
          ??????? public delegate void ChangedEventHandler(object sender, EventArgs e);

          ??????? // 定義一個(gè)事件
          ??????? public event ChangedEventHandler Changed;

          ??????? // 用以觸發(fā)Change事件
          ??????? protected virtual void OnChanged(EventArgs e)
          ??????? {
          ??????????? if (this.Changed != null)
          ??????????????? this.Changed(this, e);
          ??????? }

          ??????? // Text屬性
          ??????? public string Text
          ??????? {
          ??????????? get { return this._text; }
          ??????????? set
          ??????????? {
          ??????????????? this._text = value;
          ??????????????? // 文本改變時(shí)觸發(fā)Change事件
          ??????????????? this.OnChanged(new EventArgs());
          ??????????? }
          ??????? }
          ??? }
          }??

          posted on 2007-03-29 11:05 曾科 閱讀(174) 評(píng)論(0)  編輯  收藏 所屬分類: C#
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          .net

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 长兴县| 墨江| 建瓯市| 甘孜县| 海阳市| 大港区| 南雄市| 醴陵市| 楚雄市| 陵川县| 龙州县| 延庆县| 怀来县| 西昌市| 江口县| 宽城| 彰武县| 柳江县| 札达县| 会泽县| 弥渡县| 堆龙德庆县| 海阳市| 诏安县| 沧州市| 乌鲁木齐县| 南投县| 岚皋县| 枝江市| 固安县| 云林县| 隆昌县| 平武县| 长子县| 稻城县| 平定县| 桐乡市| 广汉市| 新和县| 桐城市| 普定县|