Delegate
delegate是C#中很重要的语法。
委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。
声明了delegate的属性都会继承自Delegate类。
使用单播委托类似C和C++的函数指针,但委托是面向对象和类型安全的(封装成delegate对象)。
使用多播委托类似观察者模式(发布/订阅模式)。实际上源码使用得最多的也是多播模式。但委托的通知实现方法绑定是基于函数签名(duck type)而非接口。相比传统的观察者模式实现更加灵活,有点像guava的Eventbus,而且实现更加优雅。
delegate不仅可以绑定外部方法,内部方法,静态方法。还能绑定匿名委托和lambda函数。可以使用 “=” 赋值委托方法,也可以使用“+=”和“-=”添加和去除委托方法。使用非常灵活方便。例子:
using System;
using System.Xml.Serialization;
namespace TestDelegateAndEvent
{
class TestDelagateAndEvent
{
public static void innerStaticSayHello(String name)
{
Console.WriteLine($"innerStaticSayHello:hello {name}");
}
public void innerSayHello(String name)
{
Console.WriteLine($"innerSayHello:hello {name}");
}
/*
* 声明delegate
*/
public delegate void SayHelloDelegate(String name);
/*
* 声明delegate对象
*/
public SayHelloDelegate sayHelloDelegate;
public event SayHelloDelegate sayHeloEvent;
public void activateSayHelloDelegate(String name)
{
sayHelloDelegate?.Invoke(name);
}
public void activateSayHelloEvent(String name)
{
sayHeloEvent?.Invoke(name);
}
}
class Test
{
public static void outerSayHello(String name)
{
Console.WriteLine($"outerSayHello:hello {name}");
}
static void Main(string[] args)
{
TestDelagateAndEvent obj = new TestDelagateAndEvent();
/*
* test delagate
*/
//delegate 能使用 "="
obj.sayHelloDelegate = obj.innerSayHello;
obj.sayHelloDelegate += TestDelagateAndEvent.innerStaticSayHello;
obj.sayHelloDelegate += Test.outerSayHello;