C#中事件只能在内部调用的原因分析
作者:cavalier23
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件,这篇文章主要介绍了C#中事件为什么只能在内部调用,需要的朋友可以参考下
在学习C#中委托和事件时,产生一个疑问,类中定义的事件在类内部可以直接调用,而在类外部,事件却只能添加或移除委托方法
比如下面这段代码,类Customer中定义了一个委托 Order ,Customer内部可以直接调用 Order.Invoke()
public class Customer { // 定义事件 public event OrderEventHandler Order; public string? name; public float? price; protected void onOrder(OrderEventArgs orderEventArgs) { if(Order != null) { Order.Invoke(this, orderEventArgs); } } ......
而在类的外部,只能添加或移除委托方法,不能调用Order.Invoke(),下面代码中customer.Order.Invoke()会报错。
public class Program{ public static void Main(string[] args) { var customer = new Customer(); customer.name = "1"; Waiter waiter = new Waiter(); customer.Order += waiter.Serve; // customer.Order.Invoke() 这样写无法编译 customer.Think(); customer.Pay(); } }
细看刘铁猛老师的《C#入门详解》后,才明白原来这是C#语法糖让我产生的误解,在定义事件时,
下面这行代码是常见的定义方式,这是一种简明的定义方法
// 事件的简明定义方式 public event OrderEventHandler Order; 而C#中事件完整的定义方式是这样: private OrderEventHandler orderEventHandler;//委托,使用private 修饰 public event OrderEventHandler Order // 事件,对委托方法进行增减 { add { this.orderEventHandler += value; } remove { this.orderEventHandler -= value; } }
使用完整写法定义事件后,在内部调用也不能用事件Order去调用了,要用委托去调用
protected void onOrder(OrderEventArgs orderEventArgs) { if(this.orderEventHandler != null) { // 调用委托 this.orderEventHandler.Invoke(this, orderEventArgs); } }
可以看到,我们真正调用的委托使用private修饰,是私有的,所以只能在内部调用,而事件(event)则是对私有的委托进行了包装,实现对委托方法的增加或移除。
刚学C#,不知道说清楚没。。。
到此这篇关于C#中事件为什么只能在内部调用的文章就介绍到这了,更多相关C#事件内部调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!