亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

對C#委托及事件委托的理解

2019-11-18 16:51:10
字體:
來源:轉載
供稿:網友

委托的聲明

public delegate void MyDelegate(string str);

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

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

個委托類型,從而在編譯的時候對該類進行封裝,對這一過程C#定義了專門的語法來處理這一過程。
4.不能從一個委托類型進行派生,因為它也是默認sealed的
5.委托即可以對靜態方法進行調用也可以對實例方法進行調用。
6.每個委托類型包含一個自己的調用列表,當組合一個委托或從一個委托中刪除一個委托時都將產生個新的調用列表。
7.兩個不同類型的委托即使它們有相同的簽名和返回值,但還是兩個不同類型的委托。但其實在使用中可看作是相同的。


委托的比較

C#中對委托定義了兩個操作符 == 和 !=
在以下情況下兩個委托是相等的:
1.當兩個委托都同時為null的時候
2.當兩個委托都不為null時,下列情況下是相等的。
a.當兩個委托的各自的調用列表只含有一個入口點的時候
   在下列情況下是相等的
   (1) 調用同一對象的同一靜態方法
   (2) 調用同一對象的同一實例方法
b.當兩個委托具有多個入口點時
   在下列情況下是相等的
   (1)只有當它們調用列表中的調用的方法按順序都一一對應相同的對象及對象的同一方法的時候

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

委托的異常處理

當調用該委托的方法中發生了異常時,首先在調用該委托的方法中搜尋catch語句塊。如果沒有,則去該委托調用的方法中去尋找有沒有catch語句塊,這和調用方法發生異常的處

理是一樣的。

當調用一個為null的委托即委托中列表中不存在調用方法時,將發生NullRefrenceException

委托的注意點:
當一個委托有多個入口點的時候,調用委托將依該委托的調用列表中的方法的順序依次調用.這些方法共享一個參數集合,所以當委托有返回值的時候調用完這個委托后的返回值是最

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

委托的一個例子

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

namespace Consoleapplication1
{
    class PRogram
    {
        static void Main(string[] args)
        {
            // 創建一個委托實例,封裝C類的靜態方法M1
            MyDelegate d1 = new MyDelegate(C.M1);
            d1("D1"); // M1

            // 創建一個委托實例,封裝C類的靜態方法M2
            MyDelegate d2 = new MyDelegate(C.M2);
            d2("D2"); // M2

            // 創建一個委托實例,封裝C類的實例方法M3
            MyDelegate d3 = new MyDelegate(new C().M3);
            d3("D3"); // M3

            // 從一個委托d3創建一個委托實例
            MyDelegate d4 = new MyDelegate(d3);
            d4("D4"); // M3

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

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

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

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

        }
    }

    // 聲明一個委托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);
        }
    }   
}

事件委托

事件概述

事件就是當對象或類狀態發生改變時,對象或類發出的信息或通知。發出信息的對象或類稱為"事件源",對事件進行處理的方法稱為"接收者",通常事件源在發出狀態改變信息時,它

并不知道由哪個事件接收者來處理.這就需要一種管理機制來協調事件源和接收者,C++中通過函數指針來完成的.在C#中事件使用委托來為觸發時將調用的方法提供類型安全的封裝


事件的聲明

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

2.聲明一個事件
public event EventHandler Changed;

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

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

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

myText.Changed += EventHandler(MyText_OnChanged);

下面的一個小例子說明了怎樣定義一個完整的事件機制:

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

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

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

        // 對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);

        // 定義一個事件
        public event ChangedEventHandler Changed;

        // 用以觸發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;
                // 文本改變時觸發Change事件
                this.OnChanged(new EventArgs());
            }
        }
    }
}  

自己的一些淺略的理解,還請大家多多批評指正!

http://www.49028c.com/ktgu/archive/2006/11/28/575279.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品福利视频| 国产精品丝袜久久久久久不卡| 欧美精品一区三区| 欧美福利视频在线观看| 亚洲国产精品va在线看黑人动漫| 538国产精品一区二区在线| 日韩欧美国产黄色| 国产精品96久久久久久又黄又硬| 日本一欧美一欧美一亚洲视频| 欧美电影电视剧在线观看| 中文字幕精品www乱入免费视频| 国产综合在线视频| 日本午夜精品理论片a级appf发布| 成人免费大片黄在线播放| 亚洲精品成人久久| 久久免费高清视频| 最好看的2019的中文字幕视频| 国内精品美女av在线播放| 中文字幕欧美视频在线| 欧美超级免费视 在线| 亚洲国产精品yw在线观看| 亚洲男人的天堂在线播放| 日本精品久久久久久久| 国内精品400部情侣激情| 视频在线观看99| 日韩中文字幕网站| 亚洲国产中文字幕在线观看| 91精品啪aⅴ在线观看国产| 亚洲毛片在线免费观看| 久久精品视频网站| 日韩中文字幕免费看| 国产精品免费一区| 国产成人午夜视频网址| 中文字幕日韩精品有码视频| 91精品久久久久久久久| 久久综合免费视频| 欧美另类99xxxxx| 成人国产亚洲精品a区天堂华泰| 亚洲摸下面视频| 国产精品亚洲第一区| 狠狠躁夜夜躁人人爽天天天天97| 久久久国产精品亚洲一区| 亚洲人成网站免费播放| 欧美黄色三级网站| 亚洲精品wwwww| 亚洲最大中文字幕| 国产精品久久久久久久久久小说| 日本欧美国产在线| 国产精品第一视频| 国产精品免费看久久久香蕉| 久久伊人色综合| 欧美亚洲在线观看| 亚洲天堂av电影| 亚洲天堂开心观看| 亚洲第一黄色网| 丝袜情趣国产精品| 亚洲成人激情小说| 精品久久久久久久久久久久久久| 日韩av在线高清| 亚洲免费视频在线观看| 久久免费观看视频| 国产在线精品成人一区二区三区| 亚洲xxx视频| 国产91精品黑色丝袜高跟鞋| 欧美日韩中国免费专区在线看| 成人中文字幕+乱码+中文字幕| 色偷偷偷亚洲综合网另类| 国产免费观看久久黄| 日本一区二区在线播放| 日韩成人激情视频| 俺也去精品视频在线观看| 97精品一区二区视频在线观看| 高清欧美电影在线| 日韩中文字幕在线观看| 国产精品日韩电影| 久热精品视频在线观看| 久久精品国产清自在天天线| 日韩免费电影在线观看| 国产精品电影一区| 欧美日韩一区二区精品| 97激碰免费视频| 欧美精品日韩www.p站| 日本一区二区在线播放| 久久久国产精彩视频美女艺术照福利| 久久久久久国产免费| 久久久久久亚洲精品中文字幕| 亚洲国产日韩精品在线| 日韩av手机在线观看| 久久久久久18| zzjj国产精品一区二区| 欧美亚洲成人免费| 亚洲国产成人爱av在线播放| 有码中文亚洲精品| 精品人伦一区二区三区蜜桃网站| 国产高清在线不卡| 亚洲精品视频免费在线观看| 中文字幕日韩av综合精品| 8x拔播拔播x8国产精品| 日韩av日韩在线观看| 久久久久99精品久久久久| 欧美亚洲日本黄色| 久久久久久久久久久久久久久久久久av| 亚洲视频免费一区| 尤物精品国产第一福利三区| 国产在线观看精品| 欧美刺激性大交免费视频| 精品欧美aⅴ在线网站| 亚州av一区二区| 国产综合福利在线| 这里只有精品久久| 亚洲性无码av在线| 亚洲国产免费av| 亚洲欧美国产另类| 久久影视电视剧免费网站| 欧美日韩成人网| 精品无人区太爽高潮在线播放| 欧美一级淫片播放口| 亚洲最大av网站| 久久成年人视频| 国产精自产拍久久久久久蜜| 欧美黑人xxxx| 亚洲韩国日本中文字幕| 日韩男女性生活视频| 欧美一区二区三区免费观看| 久久久精品欧美| 91精品国产91久久久久福利| 欧洲s码亚洲m码精品一区| 26uuu亚洲国产精品| 日韩亚洲欧美中文高清在线| 国产精国产精品| 91亚洲精品久久久| 尤物精品国产第一福利三区| 91在线视频成人| 欧美成人免费全部| 91免费在线视频| 日韩精品电影网| 成人欧美在线观看| 美女av一区二区| 成人精品久久一区二区三区| 日韩在线观看免费全集电视剧网站| 国外成人在线视频| 欧美大片在线看| 色偷偷亚洲男人天堂| 色av吧综合网| 欧美成人合集magnet| 亚洲一区二区三区四区视频| 色综合久久中文字幕综合网小说| 中文字幕久久久av一区| 亚洲小视频在线| 亚洲色图综合久久| 精品亚洲va在线va天堂资源站| 欧美极品少妇xxxxⅹ免费视频| 成人精品福利视频| 中文字幕精品在线视频| 久久久久久高潮国产精品视| 欧美成人精品在线观看| 欧美又大又硬又粗bbbbb| 日韩精品中文字幕视频在线| 国产精品综合不卡av| 国产精品成人aaaaa网站| 热久久视久久精品18亚洲精品| 91爱爱小视频k| 中文字幕av日韩| 国产一区视频在线播放|