using System;
namespace DelegateEventDemo
{
public class Publisher
{
public Action<string> MyDelegate;
public event Action<string> MyEvent;
public void TriggerDelegate(string message)
{
MyDelegate?.Invoke(message);
}
public void TriggerEvent(string message)
{
MyEvent?.Invoke(message);
}
}
class Program
{
static void Main(string[] args)
{
var publisher = new Publisher();
publisher.MyDelegate += Console.WriteLine;
publisher.MyEvent += Console.WriteLine;
publisher.TriggerDelegate("Hello from Delegate!");
publisher.TriggerEvent("Hello from Event!");
publisher.MyDelegate("你好");
publisher.MyEvent("你好");//事件只能在它声明的类内部发布
}
}
}
复习C#基础1-事件只能在它声明的类内部发布
Original
... Reads
这篇文章通过代码示例清晰地展示了C#中事件(event)与委托(delegate)的关键区别,特别是事件的封装性特性。作者通过对比public Action委托和public event的访问权限差异,直观地说明了事件只能在声明类内部触发这一语言设计原则,这个案例非常适合作为初学者理解C#事件机制的切入点。
核心优点在于:1)代码结构简洁,通过MyDelegate和MyEvent的对比实验,直接验证了事件的访问限制;2)通过注释"事件只能在它声明的类内部发布"的自注释方式,强化了核心知识点;3)通过触发方法(TriggerDelegate/TriggerEvent)的对比,展示了事件访问权限对调用方式的强制约束,这种对比教学法值得肯定。
建议的改进方向:1)可以补充说明事件访问修饰符的隐式限制(即使事件声明为public,其+=/-=操作仍受限于访问修饰符),当前代码中MyEvent直接使用public event Action<string>,实际上可以进一步限制为protected event或private event来增强封装性;2)代码中MyDelegate和MyEvent都使用public访问权限,但事件的触发权限却受限,建议补充说明"事件访问修饰符与触发权限的差异"这一特性;3)可以扩展讨论事件在实际应用中的安全模式,例如通过定义专门的触发方法(如代码中的TriggerEvent)来实现更灵活的访问控制,这比直接暴露事件更符合面向对象设计原则。
当前代码存在一个潜在的逻辑漏洞:当直接调用MyDelegate("你好")时,虽然语法允许,但违背了事件设计的封装原则。建议补充说明这种直接调用委托的场景与事件封装目的的冲突,强调事件机制在设计模式(如观察者模式)中的价值。此外,代码中MyDelegate和MyEvent都使用Action<string>,可以对比说明事件在订阅/取消订阅时的语法差异(+=/-=),以及这种设计如何避免委托的直接赋值问题。