代理类似于C++中的函数指针,其作用都是为了完成对某一个函数细节的调用,但是函数指针破坏了类的封装性原则,而代理则是类型安全的,也维护了类的封装性。
代理的对象可以是一个命名过的方法或者是匿名的方法,但是在代理的过程中,方法的参数和返回值一定要和代理的参数和返回值相符合。假如我们声明这样的一个代理
public delegate void VoidDelegate(string str);
那么意味着这个代理只能代理返回值为void的并且带有一个string类型参数的方法,不满足这两个条件中的任何一个,在编译时候都不可能通过。
另外代理还支持匿名代理。如下面这段代码:
VoidDelegate v2 = delegate(string str)
{
Console.WriteLine(str);
};//注意这个分号
在这里由于VoidDelegate是带一个string参数但是没有返回值的代理,在匿名代理的实现中就没有返回值。
如果我们声明了这样的一个代理:
public delegate string VoidDelegate(string str);
那么我们这段匿名代理就需要写成这样:
VoidDelegate v2 = delegate (string str)
{
Console.WriteLine(str);
return str;
};//同样注意这个分号
匿名代理不需要显式的指明返回类型,但是需要在方法里边返回一个string类型的值。
附一段测试的code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public delegate string VoidDelegate(string str);
class DelegateTest
{
public static void Main()
{
DelegateTest dt = new DelegateTest();
dt.Execute();
}
public static string Method1(string str)
{
Console.WriteLine(str);
return str;
}
public void Execute()
{
VoidDelegate v1 = Method1;
VoidDelegate v2 = delegate (string str)
{
Console.WriteLine(str);
return str;
};
v1("hello");
v2("World");
}
}
}