C# delegate基本使用
delegate提供了一种间接调用函数的方式
比如我有一个SayHi函数
public void SayHi(string name)
{
Console.WriteLine("hi " + name);
}
我如果想调用这个函数我可能需要这样
SayHi(“Alice”);
如果使用delegate的话,我可以不直接调用SayHi,而是去调用我的delegate间接调用SayHi,像这样
myDelegate(“Alice”);
delegate具体使用方法:
首先需要声明一个delegate,像这样
public delegate void GreetDelegate(string name);
这里GreetDelegate是我自己定义的delegate的名字,你当然可以换成别的名字;
void表明GreetDelegate间接调用的函数的返回值是void;
(string name)表明通过GreetDelegate间接调用的函数需要一个string类型的参数;
然后定义一些需要间接调用的方法例如
public void SayHi(string name)
{
Console.WriteLine("hi " + name);
}
public void SayHello(string name)
{
Console.WriteLine("hello " + name);
}
以上的方法都是符合GreetDelegate委托条件的,因为它们返回值都是void,并且需要接受一个string类型的参数,这些都是在我们声明GreetDelegate时就定义好的
之后我们就可以在Main函数中做一些测试了
using System;
namespace ConsoleApp1
{
public delegate void GreetDelegate(string name);
class Program
{
public void SayHi(string name)
{
Console.WriteLine("hi " + name);
}
public void SayHello(string name)
{
Console.WriteLine("hello " + name);
}
public static void Main(string[] args)
{
Program p = new Program();
// 创建一个委托实例并把SayHi函数交个这个委托,这样调用委托时实际上是调用了SayHi
GreetDelegate greetDelegate = new GreetDelegate(p.SayHi);
greetDelegate("Alice");
// 创建一个委托实例并把SayHi函数交个这个委托,这样调用委托时实际上是调用了SayHello
GreetDelegate greetDelegate1 = new GreetDelegate(p.SayHello);
greetDelegate1("Bob");
// 创建一个委托实例并依次把SayHi、SayHi、SayHello函数交个这个委托,这样调用委托时实际上是依次调用了SayHi、SayHi、SayHello
GreetDelegate greetDelegate2 = new GreetDelegate(p.SayHi);
greetDelegate2 += new GreetDelegate(p.SayHi);
greetDelegate2 += new GreetDelegate(p.SayHello);
greetDelegate2("隔壁老王");
}
}
}
输出结果
hi Alice
hello Bob
hi 隔壁老王
hi 隔壁老王
hello 隔壁老王