C#委托
二、委托
1. 委托
– 委托使用的目标:把函数作为参数传递
– 类似于C++中的函数指针
– 是事件处理的基础
– 委托是面向对象的、类型安全的和保险的。
– 委托声明:
• delegate double process(double db1);
• delegate 函数返回类型名委托名(函数参数)
匿名方法
• 匿名方法(anonymous methods)允许将
与一个委托关联的代码“内联(in-line)”到
使用委托的地方,我们可以很方便地将代
码直接写在委托实例中。
• 匿名方法还共享对本地语句所包含的函数
成员的访问。
• 要将代码块传递为委托参数,创建匿名方
法则是唯一的方法。
Demo 委托
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DelegateDemo
6 {
7 class Class1
8 {
9 delegate double processDelegate(double db1, double db2);
10 static double Multiply(double db1, double db2)
11 {
12 return db1 * db2;
13 }
14 static double Divide(double db1, double db2)
15 {
16 return db1 / db2;
17 }
18 static void NamedMethod(string strInput,double dbNum1,double dbNum2)
19 {
20 processDelegate process;
21 if (strInput == "M")
22 process = new processDelegate(Multiply);
23 else
24 process = new processDelegate(Divide);
25 Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));
26
27 }
28 static void AnonymousMethod(string strInput, double dbNum1, double dbNum2)
29 {
30 processDelegate process;
31 if (strInput == "M")
32 process = delegate(double db1, double db2){return db1 * db2;};
33 else
34 process = delegate(double db1, double db2) { return db1 / db2; };
35 Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));
36
37 }
38 /// <summary>
39 /// 应用程序的主入口点。
40 /// </summary>
41 [STAThread]
42 static void Main(string[] args)
43 {
44 //
45 // TODO: 在此处添加代码以启动应用程序
46 Console.WriteLine("请输入两个小数,用逗号分割");
47 string strInput = Console.ReadLine();
48 int commmaPos = strInput.IndexOf(',');
49 double dbNum1 = Convert.ToDouble(strInput.Substring(0, commmaPos));
50 double dbNum2 = Convert.ToDouble(strInput.Substring(commmaPos + 1));
51 Console.WriteLine("输入M表示乘法,或者D表示除法");
52 strInput = (Console.ReadLine()).ToUpper();
53 //使用命名方法
54 Console.WriteLine("使用命名方法委托");
55 NamedMethod(strInput,dbNum1,dbNum2);
56 //使用匿名方法
57 Console.WriteLine("使用匿名方法委托");
58 AnonymousMethod(strInput, dbNum1, dbNum2);
59
60 }
61 }
62
63 }
64
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DelegateDemo
6 {
7 class Class1
8 {
9 delegate double processDelegate(double db1, double db2);
10 static double Multiply(double db1, double db2)
11 {
12 return db1 * db2;
13 }
14 static double Divide(double db1, double db2)
15 {
16 return db1 / db2;
17 }
18 static void NamedMethod(string strInput,double dbNum1,double dbNum2)
19 {
20 processDelegate process;
21 if (strInput == "M")
22 process = new processDelegate(Multiply);
23 else
24 process = new processDelegate(Divide);
25 Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));
26
27 }
28 static void AnonymousMethod(string strInput, double dbNum1, double dbNum2)
29 {
30 processDelegate process;
31 if (strInput == "M")
32 process = delegate(double db1, double db2){return db1 * db2;};
33 else
34 process = delegate(double db1, double db2) { return db1 / db2; };
35 Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));
36
37 }
38 /// <summary>
39 /// 应用程序的主入口点。
40 /// </summary>
41 [STAThread]
42 static void Main(string[] args)
43 {
44 //
45 // TODO: 在此处添加代码以启动应用程序
46 Console.WriteLine("请输入两个小数,用逗号分割");
47 string strInput = Console.ReadLine();
48 int commmaPos = strInput.IndexOf(',');
49 double dbNum1 = Convert.ToDouble(strInput.Substring(0, commmaPos));
50 double dbNum2 = Convert.ToDouble(strInput.Substring(commmaPos + 1));
51 Console.WriteLine("输入M表示乘法,或者D表示除法");
52 strInput = (Console.ReadLine()).ToUpper();
53 //使用命名方法
54 Console.WriteLine("使用命名方法委托");
55 NamedMethod(strInput,dbNum1,dbNum2);
56 //使用匿名方法
57 Console.WriteLine("使用匿名方法委托");
58 AnonymousMethod(strInput, dbNum1, dbNum2);
59
60 }
61 }
62
63 }
64