C Sharp(八)
發佈於 2018-10-31
这一篇,我们讲讲 C# 中特殊的委托(delegate)。
委托和类一样,都是用户定义类型。类表示数据和方法的集和,而委托则是持有一个或多个方法,以及一系列预定义操作。
我们通过以下步骤来使用委托:
delegate void MyDel(int x); |
---|
有两种方式创建委托对象:
delVal = new MyDel(instance.MyM1); //实例方法 dVal = new MyDel(SClass.OtherM2); //静态方法 |
---|
delVal = instance.MyM1; dVal = SClass.OtherM2; |
---|
我们使用 += 操作符为委托增加方法。
MyDel del = inst.M1; del += SCl.M3; del += X.Act; |
---|
同样使用 -= 从委托移除方法。
我们可以像调用方法一样调用委托:
MyDel del = inst.M1; del += SCl.M3; del += X.Act; //... del(444); |
---|
delegate int MyDel(); class MyCls { public int IntVal = 5; public int Add2() { IntVal += 2; return IntVal; } public int Add3() { IntVal += 3; return IntVal; } } class Program { static void Main() { MyCls cls = new MyCls(); MyDel del = new MyDel(cls.Add2); del += cls.Add3; del += cls.Add2; Console.WriteLine(del()); //12 { } |
---|
再调用方法列表的下一个方法时,参数的新值会传给下一个方法。
delegate void MyDel(ref int x); class MyCls { public void Add2(ref int x) { x += 2; } public void Add3(ref int x) { x += 3; } } class Program { static void Main() { MyCls cls = new MyCls(); MyDel del = new MyDel(cls.Add2); del += cls.Add3; del += cls.Add2; int x = 5; del(ref x); Console.WriteLine(x); //12 } } |
---|
我们可以使用 Lambda 表达式创建委托对象。 C# 中的 Lambda 表达式与 JavaScript 中的很像。如果只有一个参数,可以省略括号,如果只有一个返回值语句,可以省略大括号和 reuturn 关键字。
MyDel del = (int x) => { return x + 1; }; //简写形式 MyDel del = x => x + 1; |
---|