VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > C#編程 >
  • C#教程之C# 委托和事件

  • 2019-01-21 20:13 來源:未知

一、委托

1. 定義

魔兽世界wow www.geyjm.icu   委托是一個類,它定義了方法的類型,使用委托可以將多個方法綁定到同一個委托變量,當調用此變量時,可以依次調用所有綁定的方法。

 

2. 測試事例

  假如你需要向別人問好,在國際化社會,你可能需要用多種語言問候。

  普通的思路可以用 if 或者 swith 判斷然后調用相應的代碼,但是可拓展行差。

  下面介紹使用委托的辦法。

復制代碼
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Delegate
 8 {
 9     /// <summary>
10     /// 委托定義方法的簽名,沒有函數體
11     /// 委托可以定義在類外面
12     /// </summary>
13     /// <param name="name">姓名</param>
14     public delegate void GreetingDelegate(string name);
15 
16     class Program
17     {
18         /// <summary>
19         /// 英文問候
20         /// 注意函數簽名要與委托相同
21         /// </summary>
22         /// <param name="name">姓名</param>
23         private static void EnglishGreeting(string name)
24         {
25             Console.WriteLine("Morning! " + name);
26         }
27 
28         /// <summary>
29         /// 中文問候
30         /// 注意函數簽名要與委托相同
31         /// </summary>
32         /// <param name="name">姓名</param>
33         private static void ChineseGreeting(string name)
34         {
35             Console.WriteLine("早上好! " + name);
36         }
37 
38         /// <summary>
39         /// 問候
40         /// </summary>
41         /// <param name="name">姓名</param>
42         /// <param name="greeting">委托</param>
43         private static void GreetPeople(string name, GreetingDelegate greetingDelegate)
44         {
45             greetingDelegate(name);                 // 調用綁定的方法
46         }
47 
48         static void Main(string[] args)
49         {
50             GreetingDelegate greetingDelegate;
51             // 注意 第一次綁定要用 =
52             greetingDelegate = EnglishGreeting;     // 將英文問候綁定到委托
53             GreetPeople("Lin", greetingDelegate);   // 此時綁定了一個個方法
54             greetingDelegate += ChineseGreeting;    // 再將中文問候綁定到委托
55             GreetPeople("Lin", greetingDelegate);   // 此時綁定了兩個方法
56             greetingDelegate -= EnglishGreeting;    // 將英文問候從委托中移除
57             GreetPeople("Lin", greetingDelegate);   // 此時綁定了一個個方法
58 
59             Console.ReadKey();
60         }
61     }
62 }
復制代碼

 

 3. 運行截圖

 

 

 

 

二、事件

1. 委托和事件的區別

  委托是具有相同簽名的函數(方法)的類型,事件是委托的應用方式之一。

 

2. 測試事例

  我們還是使用上述委托所用的事例,那么使用事件的代碼如下:

復制代碼
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Event
 8 {
 9     /// <summary>
10     /// 委托定義方法的簽名,沒有函數體
11     /// 委托可以定義在類外面
12     /// </summary>
13     /// <param name="name">姓名</param>
14     public delegate void GreetingDelegate(string name);
15     
16     /// <summary>
17     /// 問候管理類
18     /// </summary>
19     public class GreetingManage
20     {
21         public event GreetingDelegate makeGreet;       // 聲明事件
22 
23         public void GreetPeople(string name)            // 問候
24         {
25             if (makeGreet != null)
26             {
27                 makeGreet(name);
28             }
29         }
30     }
31 
32     class Program
33     {
34         /// <summary>
35         /// 英文問候
36         /// 注意函數簽名要與委托相同
37         /// </summary>
38         /// <param name="name">姓名</param>
39         private static void EnglishGreeting(string name)
40         {
41             Console.WriteLine("Morning! " + name);
42         }
43 
44         /// <summary>
45         /// 中文問候
46         /// 注意函數簽名要與委托相同
47         /// </summary>
48         /// <param name="name">姓名</param>
49         private static void ChineseGreeting(string name)
50         {
51             Console.WriteLine("早上好! " + name);
52         }
53 
54         static void Main(string[] args)
55         {
56             GreetingManage gm = new GreetingManage();
57             //gm.makeGreet = EnglishGreeting;       // 報錯,不能用 = 賦值
58             gm.makeGreet += EnglishGreeting;        // 添加綁定方法
59             gm.makeGreet += ChineseGreeting;
60             gm.GreetPeople("Lin");                  // 此時綁定了兩個方法
61             gm.makeGreet -= EnglishGreeting;        // 去除綁定
62             gm.GreetPeople("Lin");                  // 此時綁定了一個方法
63 
64             Console.ReadKey();
65         }
66     }
67 }
復制代碼

 

3. 運行截圖

 

相關教程