委托是一种可以把引用存储为函数的类型。通俗来讲就是一个能存放符合某种格式(方法签名)的方法指针的容器。委托的声明制定了一个返回类型和一个参数列表。在定义了委托后,就可以生命该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。委托又许多用途,大多数常见用途主要与事件处理有关。
一、委托的声明--使用deletage关键字:
1、定义委托变量
[访问修饰符] delegate 返回类型 委托名(形参);
2、声明委托对象并创建委托对象
委托名 委托实例名 = new 委托名(方法名);
3、使用委托调用方法
委托实例名(实参)
实例:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelagateTest 7 { 8 class Program 9 { 10 //1.定义委托变量-此处定义了一个带2个参数,1个返回值的委托变量 11 delegate double ProcessDelegate(double p1, double p2); 12 13 //方法1 14 static double Multiply(double p1, double p2) 15 { 16 return p1 * p2; 17 } 18 19 //方法2 20 static double Divide(double p1, double p2) 21 { 22 return p1 / p2; 23 } 24 25 static void Main(string[] args) 26 { 27 double p1 = 10; 28 double p2 = 2; 29 //2.创建委托对象,并绑定一个带2个参数,1个返回值的方法 30 ProcessDelegate pd = new ProcessDelegate(Multiply); 31 32 //向委托对象增加一个方法(此处用了超简单语法) 33 pd += Divide;//编译器 语法糖,编译后相当于 pd = (ProcessDelegate)Delegate.Combine(pd, new ProcessDelegate(Divide)); 34 35 //向委托对象删除一个方法(此处用了超简单语法) 36 pd -= Divide;//编译器 语法糖,编译后相当于 pd = (ProcessDelegate)Delegate.Remove(pd, new ProcessDelegate(Divide)); 37 38 //3.调用委托 39 double result = pd(p1, p2); 40 Console.WriteLine("结果为{0}", result); 41 Console.ReadKey(); 42 } 43 } 44 }
二、语法糖
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelagateTest 7 { 8 class Program 9 { 10 //1.创建委托变量 11 delegate void SayHello(); 12 static void Main(string[] args) 13 { 14 //2.创建委托对象,并绑定一个无参数返回值的方法 15 SayHello sayHello = SayHiByChinese;//编译器 语法糖,编译后相当于 SayHello sayHello = new SayHello(SayHiByChinese); 16 17 //向委托对象增加一个方法(完整语法) 18 sayHello = (SayHello)Delegate.Combine(sayHello, new SayHello(SayHiByEnglish)); 19 20 //向委托对象增加一个方法(简单语法) 21 sayHello += new SayHello(SayHiByKorean);//编译器 语法糖,编译后相当于 sayHello = (SayHello)Delegate.Combine(pd, new DGSayHi(SayHiByKorean)); 22 23 //向委托对象增加一个方法(简单语法) 24 sayHello += SayHiByJapanese;//编译器 语法糖,编译后相当于 sayHello = (SayHello)Delegate.Combine(pd, new SayHello(SayHiByJapanese)); 25 26 //3.调用委托里的 所有方法 27 sayHello();//语法糖,编译后:dgSayHi.Invoke(); 28 29 //向委托对象删除一个方法(简单语法) 30 sayHello -= SayHiByJapanese;//编译器 语法糖,编译后相当于 sayHello = (SayHello)Delegate.Remove(pd, new SayHello(SayHiByJapanese)); 31 32 Console.ReadKey(); 33 } 34 35 36 //中文打招呼 37 static void SayHiByChinese() 38 { 39 Console.WriteLine("你好!"); 40 } 41 42 //英语打招呼 43 static void SayHiByEnglish() 44 { 45 Console.WriteLine("Hello"); 46 } 47 48 //韩语打招呼 49 static void SayHiByKorean() 50 { 51 Console.WriteLine("안녕하세요."); 52 } 53 54 //日语打招呼 55 static void SayHiByJapanese() 56 { 57 Console.WriteLine("こんにちは!"); 58 } 59 } 60 }