LearnPlayground\PubSub\Program.cs
using System;
// 定义一个委托类型
public delegate void MyDelegate(string message);
public class Publisher
{
// 定义一个事件,使用前面定义的委托类型
public event MyDelegate OnMessagePublished;
public void PublishMessage(string message)
{
Console.WriteLine("Publishing message: " + message);
// 触发事件
OnMessagePublished?.Invoke(message);
}
}
public class Subscriber
{
private Publisher publisher;
public Subscriber(Publisher pub)
{
publisher = pub;
// 订阅事件
publisher.OnMessagePublished += OnMessageReceived;
publisher.OnMessagePublished += OnMessageReceived2;
}
// 定义一个方法,该方法会在事件被触发时调用
private void OnMessageReceived(string message)
{
Console.WriteLine("Subscriber received message: " + message);
}
private void OnMessageReceived2(string message)
{
Console.WriteLine("Subscriber received message2: " + message);
}
}
/// <summary>
/// 发布器里面会有个委托类型的变量,
/// 在订阅器里面会将要需要触发的函数传递给发布器里面委托类型的变量,
/// 如何传入,会将发布器的示例作为订阅器构造函数的参数,然后在订阅器的构造函数里面将自己的一些方法,添加给(使用加等于符号)发布器的委托类型
/// </summary>
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber(publisher);
// 发布消息
publisher.PublishMessage("Hello, World!");
}
}
LearnPlayground\PubSub\PubSub.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
LearnPlayground\LearnPlayground.sln
为什么使用 +=
符号
在C#中,使用 +=
符号来订阅事件有几个关键原因:
-
多重订阅:
- 使用
+=
符号可以让你在同一事件上注册多个处理方法。每次事件触发时,所有注册的方法都会被依次调用。 - 如果你不使用
+=
而是直接使用赋值运算符=
,那么新注册的方法将会覆盖之前注册的所有方法。
- 使用
-
线程安全:
+=
和-=
运算符提供了线程安全的机制来添加和移除事件处理程序。这意味着即使在多线程环境中,也可以安全地添加或移除事件处理程序,而不会引起竞态条件。
-
简洁性:
- 使用
+=
使得代码更加简洁明了,易于阅读和维护。
- 使用