本篇内容主要讲解“C#中事件只能在内部调用的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“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#中事件只能在内部调用的原因是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!