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

 更新时间:2021年11月26日 08:43:28   作者: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#事件内部调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中?、?.、??、??=运算符的用法

    C#中?、?.、??、??=运算符的用法

    本文主要介绍了C#中?、?.、??、??=运算符的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C#实现单例模式的几种方法总结

    C#实现单例模式的几种方法总结

    这篇文章主要介绍了C#实现单例模式的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C#9.0:Init相关总结

    C#9.0:Init相关总结

    这篇文章主要介绍了C#9.0:Init的相关资料,帮助大家更好的理解和学习新版的c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# 标准事件流实例代码

    C# 标准事件流实例代码

    这篇文章主要介绍了C# 标准事件流的实例代码,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • c#实现无标题栏窗口的拖动

    c#实现无标题栏窗口的拖动

    本篇文章是对c#中实现无标题栏窗口拖动的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • .net 随机生成汉字

    .net 随机生成汉字

    在c#中可以使用system.text来处理所有语言编码,其中encodiong类是比较重要的汉字编码类,接下来我们就围绕c#随机生成汉字代码讲起,有需要的朋友可以参考下
    2015-08-08
  • C#判断语句的表达式树实现

    C#判断语句的表达式树实现

    这篇文章介绍了C#判断语句的表达式树实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#遍历List并删除某个元素的方法

    C#遍历List并删除某个元素的方法

    这篇文章主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
    2015-02-02
  • Unity UGUI的ToggleGroup选项组件介绍使用

    Unity UGUI的ToggleGroup选项组件介绍使用

    这篇文章主要为大家介绍了Unity UGUI的ToggleGroup选项组件介绍使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C# JWT权限验证的实现

    C# JWT权限验证的实现

    本文主要介绍了C# JWT权限验证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论