软件编程
位置:首页>> 软件编程>> C#编程>> C#中事件只能在内部调用的原因分析

C#中事件只能在内部调用的原因分析

作者:cavalier23  发布时间:2023-08-09 05:07:00 

标签: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#,不知道说清楚没。。。

来源:https://www.cnblogs.com/cavaliers20160620/archive/2021/11/26/15605758.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com