程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#之委托和事件的區別,

c#之委托和事件的區別,

編輯:C#入門知識

c#之委托和事件的區別,


下面開始對事件進行介紹

1、定義事件以及事件的編譯原理

首先定義事件對應的委托:

1 public delegate void ThreeClickEventDel();

 

然後對應事件變量:(其實就是在委托前面加一個event)

public event ThreeClickEventDel ThreeClickEvent;

 

反編譯之後:是:一個“私有委托”和兩個“公有”的“add”和“remover”方法

1)因為是私有委托:所以只有類的內部可以調用,在類外部就不能被調用。創建的類的實例也是不能調用的。所以事件是安全的。

                           因為私有,所以不能使用 “=”對事件進行賦值

2)因為有 “公有” 的add 和 remove,,所以 類的實例 可以對事件 進行 “+=”和“-=”對事件進行 添加 事件和 刪除事件(所以在類的外部可以對事件進行賦值,但是不能調用)

 

2、委托和事件的區別:

1、委托時數據類型,但是 事件 是數據類型的變量(並且是私有委托)

2、委托可以在類的外部被調用,但是事件不能再類的外部,通過類的實例進行調用(因為是私有委托)

3、委托可以通過“=”、“+=”、“-=”進行賦值,但是事件只能通過“+=”和“-=”對事件進行賦值。(因為事件是私有委托)

 

3、委托也能注冊事件,為什麼會衍生出事件呢?

 委托注冊事件:

復制代碼
 1     //定義一個委托
 2     public delegate void JingGaoDel();
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             GuoluFang Guolu = new GuoluFang();
 8             //為 委托注冊 事件
 9             Guolu.jingGao = delegate()
10             {
11                 Console.WriteLine("水已經燒開了!");
12             };
13             for (int i = 0; i <100; i++)
14             {
15                 Guolu.ShaoShui();
16             }
17             Console.ReadKey();
18         }
19     }
復制代碼

 

為什麼衍生事件:

1、因為事件只能通過“+=”和“-=”進行賦值,所以可以避免像委托那樣(可能用“=”賦值將原有的事件沖掉)。

2、事件雖然是public 定義的,但是會編譯成“私有的委托”,所以事件只能在類的內部被調用,類的實例不能被調用。

 

4、使用事件的練習(窺探微軟 的事件)

 創建驗證控件:

添加一個UserControl控件,設計如下:

寫後台代碼:

 控件後台代碼

 

主窗體添加驗證控件:

後台代碼:

復制代碼
 1         private void Form1_Load(object sender, EventArgs e)
 2         {
 3             //注冊事件
 4             userVilidateControl1.UserViliDating += new UserVilidateDel(userVilidateControl1_UserViliDating);
 5         }
 6 
 7         //創建對應方法事件
 8         void userVilidateControl1_UserViliDating(object sender, MyEventArgs e)
 9         {
10             if (e.UserName == "admin" && e.Pwd == "123")
11             {
12                 e.IsSuccess = true;
13             }
14         }
復制代碼

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved