C# 委托(Delegate)
我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。
相同标签方法
相同标签方法,是指一个方法的 返回类型、参数类型、参数个数和其他方法一模一样 例如我们指定一个方法
public int MultNum(int q){}
它和以下几种函数是具有相同标签
public int AddNum(int q){} public int AddNum2(int h ){} public int MinusNum(int g ){}
但它和以下方法就不是相同标签方法
public int AddNum(int q,int p ){} // 返回值相同,但是参数个数不同 public int AddNum2(byte q){} // 返回值相同,参数个数相同,但是参数类型不同 public byte AddNum3(int h){} // 参数个数和参数类型相同,但是返回值类型不同
匿名方法(Anonymous methods)
匿名方法是没有名称只有主体的方法。
C# 2.0引入了匿名方法。
开发人员在实现方法的时候,只需要给出方法的参数列表(甚至也可以不给)以及方法具体实现,而不需要关心方法的返回值,更不必给方法起名字。
最关键的是,只在需要的地方定义匿名方法,保证了代码的简洁。
他的优点如下:
- 匿名方法可以在需要时再定义。
- 匿名方法提供了一种传递代码块作为委托参数的技术。
- 使用匿名方法时您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
匿名方法语法
匿名方法是通过使用 delegate 关键字创建委托范例来声明的
delegate (parameters ){implementationcode}; 关键字 参数 语句块
例如:
delegate(int x) { Console.WriteLine("Anonymous Method: {0}", x); };
以上代码就创建了一个匿名方法,这个匿名方法有一个 int 类型的参数
代码块 Console.WriteLine("Anonymous Method: {0}", x); 是匿名方法的主体。
匿名方法不会声明返回值类型。但是匿名方法返回值类型必须和委托返回值一样。
参数:参数数量,类型和修饰符必须和委托一样。
当我们的匿名方法没有任何参数或者参数列表不包含任何out参数时,我们可以使用空圆括号()
,或省略圆括号来简化匿名方法的参数列表。
调用委托
委托可以通过匿名方法调用,也可以通过命名方法调用,即,通过向委托对象传递方法参数。
例如:
nc(10);
范例
下面的范例演示了匿名方法和委托的使用方式:
using System; delegate void NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 27; public static void AddNum(int p) { num += p; Console.WriteLine("Named Method: {0}", num); } public static void MultNum(int q) { num *= q; Console.WriteLine("Named Method: {0}", num); } public static int getNum() { return num; } static void Main(string[] args) { // 使用匿名方法创建委托范例 NumberChanger nc = delegate(int x) { Console.WriteLine("Anonymous Method: {0}", x); }; // 使用匿名方法调用委托 nc(18); // 使用命名方法范例化委托 nc = new NumberChanger(AddNum); // 使用命名方法调用委托 nc(4); // 使用另一个命名方法范例化委托 nc = new NumberChanger(MultNum); // 使用命名方法调用委托 nc(2); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
Anonymous Method: 18 Named Method: 31 Named Method: 54