参考链接:
https://www.tutorialsteacher.com/csharp/csharp-event
https://www.tutorialsteacher.com/csharp/csharp-delegates
https://csharpindepth.com/Articles/Events
https://kudchikarsk.com/publish-subscribe-design-pattern-in-csharp/
1.delegate 类似于 c/c++的指针,但比c/c++更为强大。
delegate相比于c/c++中的指针更为安全,它是引用类型。
delegate的格式:
delegate 分为单播和多播。
单播只能指向一个Method,
单播例子:
class Program
{
// declare delegate
public delegate void Print(int value);
static void Main(string[] args)
{
// Print delegate points to PrintNumber
Print printDel = PrintNumber;
// or
// Print printDel = new Print(PrintNumber);
printDel(100000);
printDel(200);
// Print delegate points to PrintMoney
printDel = PrintMoney;
printDel(10000);
printDel(200);
}
public static void PrintNumber(int num)
{
Console.WriteLine("Number: {0,-12:N0}",num);
}
public static void PrintMoney(int money)
{
Console.WriteLine("Money: {0:C}", money);
}
}
多播可以指向多个Method
用+操作符 去增加 一个 指向的function
用-操作符 去删除 一个指向的 function
多播例子:
public delegate void Print(int value);
static void Main(string[] args)
{
Print printDel = PrintNumber;
printDel += PrintHexadecimal;
printDel += PrintMoney;
printDel(1000);
printDel -=PrintHexadecimal;
printDel(2000);
}
public static void PrintNumber(int num)
{
Console.WriteLine("Number: {0,-12:N0}",num);
}
public static void PrintMoney(int money)
{
Console.WriteLine("Money: {0:C}", money);
}
public static void PrintHexadecimal(int dec)
{
Console.WriteLine("Hexadecimal: {0:X}", dec);
}
2.pub-sub model
pub-sub model为异步编程的重要手段,也用于.net framework的事件驱动。
.net框架使用EventHander delegate和EventArgc 这个基类。
pub-sub model 相关例子:
publisher:
public class PrintHelper
{
// declare delegate
public delegate void BeforePrint();
//declare event of type delegate
public event BeforePrint beforePrintEvent;
public PrintHelper()
{
}
public void PrintNumber(int num)
{
//call delegate method before going to print
if (beforePrintEvent != null)
beforePrintEvent();
Console.WriteLine("Number: {0,-12:N0}", num);
}
public void PrintDecimal(int dec)
{
if (beforePrintEvent != null)
beforePrintEvent();
Console.WriteLine("Decimal: {0:G}", dec);
}
public void PrintMoney(int money)
{
if (beforePrintEvent != null)
beforePrintEvent();
Console.WriteLine("Money: {0:C}", money);
}
public void PrintTemperature(int num)
{
if (beforePrintEvent != null)
beforePrintEvent();
Console.WriteLine("Temperature: {0,4:N1} F", num);
}
public void PrintHexadecimal(int dec)
{
if (beforePrintEvent != null)
beforePrintEvent();
Console.WriteLine("Hexadecimal: {0:X}", dec);
}
}
subscriber:
class Number
{
private PrintHelper _printHelper;
public Number(int val)
{
_value = val;
_printHelper = new PrintHelper();
//subscribe to beforePrintEvent event
_printHelper.beforePrintEvent += printHelper_beforePrintEvent;
}
//beforePrintevent handler
void printHelper_beforePrintEvent()
{
Console.WriteLine("BeforPrintEventHandler: PrintHelper is going to print a value");
}
private int _value;
public int Value
{
get { return _value; }
set { _value = value; }
}
public void PrintMoney()
{
_printHelper.PrintMoney(_value);
}
public void PrintNumber()
{
_printHelper.PrintNumber(_value);
}
}
创建Number类的实例,
Number myNumber = new Number(100000);
myNumber.PrintMoney();//fire event
myNumber.PrintNumber();
运行效果: