C# 委托(一)
委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
可以通过以下操作步骤来使用委托。
声明一个委托类型,委托声明看上去和方法声明相似,只是没有实现块。
使用该委托类型声明一个委托变量。
创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。
你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。
在代码中你可以像调用方法一样调用委托。在调用委托的时候,其包含的每一个方法都会被执行。
C# 中通过委托静态方法:
using System; namespace 委托 { delegate int Wt(int x); //声明委托类型 class Program { public static int num = 1;//声明一个全局静态 整型变量,并赋值为 1 static void Main(string[] args) { Wt d = new Wt(F);//声明委托变量 d(10);//执行委托 Console.WriteLine("num的值为: {0}",num);//输出num的值 Console.ReadKey();//按任意键 } public static int F(int i) //全局静态方法 { num += i;// num = num + 1 return num;// 返回num的值 } } }
输出结果:
C# 中通过委托实例化方法:
using System; namespace 委托1 { delegate int Wt(int x);//声明委托类型 class Program { static void Main(string[] args) { L c = new L(); //实例化L类 Wt d = new Wt(c.F);//声明委托变量 d(10);//执行委托 Console.WriteLine("c.num的值为: {0}", c.num);//输出num的值 Console.ReadKey();//按任意键 } } class L //类 { public int num = 1; // 全局字段 public int F(int i) //全局方法 { num += i; //num = num + i。 return num;//返回num的值。 } } }
输出结果:
委托可以使用额外的运算符来“组合”。这个运算符最终会创建一个新的委托,其调用列表连接了作为操作数的两个委托的调用列表副本。
尽管术语 组合委托 让我们觉得好像操作数委托被修改了,其实它们并没有被修改。事实上,委托是恒定的。委托对象被创建后不能被改变。
可以使用+=运算符为委托添加方法。
可以使用-=运算符从委托移除方法。
组合委托:
using System; namespace 组合委托 { delegate void Wt(int x);//声明委托类型 class Program { static void Main(string[] args) { Console.WriteLine(" d1(1) 输出结果:"); Wt d1 = new Wt(C.A1);//声明委托对象 d1(1);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d2(2) 输出结果:"); Wt d2 = new Wt(C.A2);//声明委托对象 d2(2);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d3(3) 输出结果:"); C c = new C();//实例化类的对象 Wt d3 = new Wt(c.A3);//声明委托对象 d3(3);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d4(4) 输出结果:"); Wt d4 = d1 + d2 + d3; //声明委托对象 并初始化 d4(4);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d4(40) 输出结果:"); d4 += d1;//声明委托对象 并增加方法 d4(40);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d4(400) 输出结果:"); d4 -= d1;//声明委托对象 并移除方法 d4(400);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d4(4000) 输出结果:"); d4 -= d2;//声明委托对象 并移除方法 d4 -= d1;//声明委托对象 并移除方法 d4(4000);//执行委托 Console.WriteLine("————————"); Console.WriteLine(" d4(4000) 输出结果:"); if ((d4 -= d3) == null)//判断当前d4 中是否还有方法。当d4中没有方法 则为 null { Console.WriteLine("目前d4列表内为 null ");//输出 } else { d4(40000);//执行委托 } Console.WriteLine("————————"); Console.ReadKey(); } } class C //类 { public static void A1(int i)//全局静态方法 { Console.WriteLine("A1的值为:"+ i);//输出 } public static void A2(int i)//全局静态方法 { Console.WriteLine("A2的值为:" + i);//输出 } public void A3(int i)//全局方法 { Console.WriteLine("A3的值为:" + i);//输出 } } }
输出结果: