在c#中可以使用委托来实现一些接口的功能,委托也是可以实例化的,实例化委托的参数就是委托对应的方法,然后将该实例赋值给委托变量,执行该委托变量来调用委托中的方法,请看如下代码:
static class Program
{
delegate void TestDelegate(string msg);
[STAThread]
static void Main()
{
TestDelegate td = new TestDelegate(TestDelegateMthod);
td("hello");
}
private static void TestDelegateMthod(string msg)
{ Console.WriteLine(msg + "!"); }
}
需要注意的是,委托相关的操作符有三个:=,+=,-+,=的含义是将=右边的委托实例赋值给=左边的委托变量,如果该变量已经包含了委托实例,则以前的委托实例将被新的实例所取代,+=的含义是将+=右边的委托实例添加到+=左边的委托变量中,委托变量可以保存多个委托实例,如果该变量已经保存有委托实例了,则会把新的委托实例添加到委托变量中,-+的含义是从-+左边的委托变量中移除右边的委托实例
在实例化委托时可以不使用new关键字,请看如下代码:
TestDelegate td = TestDelegateMthod;
当编译的时候编译器会自动添加new关键字,将TestDelegateMthod替换为new TestDelegate(TestDelegateMthod)。
在2.0以后的版本中可以使用匿名方法,所以我们在实例化委托时可以不定义对应方法,而直接指定执行代码块,请看代码:
TestDelegate td = delegate(string msg)
{
Console.WriteLine(msg);
};
在2.0以后的版本中可以使用泛型,在委托中我们同样可以使用泛型,请看代码:
static class Program
{
delegate void TestDelegate<t>(t msg);
[STAThread]
static void Main()
{
TestDelegate<string> td1 = TestDelegateMthod;
td1("hi");
}
private static void TestDelegateMthod(string msg)
{ Console.WriteLine(msg + "!"); }
}
在以上代码中使用泛型来定义了要传入的参数类型,这样我们就可以在申明委托时再指定参数类型。由于在申明委托时已经指定具体的参数类型,所以我们在实例化委托时就可以使用具体的参数类型了,上面代码中的TestDelegateMthod方法使用的就是具体的参数类型,还可以如下写:
TestDelegate<string> td1 =TestDelegateMthod<string>;
private static void TestDelegateMthod<t>(t msg)
{
Console.WriteLine(msg.ToString());
}
在这里实例化委托时指定了一个泛型方法。
理解了以上内容,再来看3.5中的Func<T, TResult>这类委托就容易理解了。
来源:https://www.cnblogs.com/tendzzss/archive/2009/08/28/1848201.html