服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中事件只能在内部调用的原因分析

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

2022-12-09 13:00cavalier23 C#

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件,这篇文章主要介绍了C#中事件为什么只能在内部调用,需要的朋友可以参考下

在学习C#中委托和事件时,产生一个疑问,类中定义的事件在类内部可以直接调用,而在类外部,事件却只能添加或移除委托方法
比如下面这段代码,类Customer中定义了一个委托 Order ,Customer内部可以直接调用 Order.Invoke()
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()会报错。
?
1
2
3
4
5
6
7
8
9
10
11
12
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#语法糖让我产生的误解,在定义事件时,
下面这行代码是常见的定义方式,这是一种简明的定义方法
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 事件的简明定义方式
public event  OrderEventHandler Order;
而C#中事件完整的定义方式是这样:
        private OrderEventHandler orderEventHandler;//委托,使用private 修饰
        public event  OrderEventHandler Order // 事件,对委托方法进行增减
        {
            add
            {
                this.orderEventHandler += value;
            }
            remove
            {
                this.orderEventHandler -= value;
            }
        }
使用完整写法定义事件后,在内部调用也不能用事件Order去调用了,要用委托去调用
?
1
2
3
4
5
6
7
8
protected void onOrder(OrderEventArgs orderEventArgs)
   {
       if(this.orderEventHandler != null)
       {
           // 调用委托
           this.orderEventHandler.Invoke(this, orderEventArgs);
       }
   }
可以看到,我们真正调用的委托使用private修饰,是私有的,所以只能在内部调用,而事件(event)则是对私有的委托进行了包装,实现对委托方法的增加或移除。
刚学C#,不知道说清楚没。。。

到此这篇关于C#中事件为什么只能在内部调用的文章就介绍到这了,更多相关C#事件内部调用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/cavaliers20160620/archive/2021/11/26/15605758.html

延伸 · 阅读

精彩推荐
  • C#C#清理非托管对象实例分析

    C#清理非托管对象实例分析

    这篇文章主要介绍了C#清理非托管对象的方法,结合实例形式详细分析了C#清理非托管对象释放资源的相关原理与实现技巧,需要的朋友可以参考下...

    Microblue8042021-11-14
  • C#C#编写COM组件的方法分析

    C#编写COM组件的方法分析

    这篇文章主要介绍了C#编写COM组件的方法,结合实例形式分析了C#编写COM组件的具体步骤与相关实现技巧,需要的朋友可以参考下...

    廖先生6262022-01-10
  • C#C# 中的 is 真的是越来越强大越来越语义化(推荐)

    C# 中的 is 真的是越来越强大越来越语义化(推荐)

    这篇文章主要介绍了C# 中的 is 真的是越来越强大越来越语义化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    一线码农5392022-10-10
  • C#Unity实现移动端手势解锁功能

    Unity实现移动端手势解锁功能

    这篇文章主要为大家详细介绍了Unity实现移动端手势解锁功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    LLLLL_4442022-09-23
  • C#C#迭代器及Unity协程实例解析

    C#迭代器及Unity协程实例解析

    这篇文章主要介绍了C#迭代器及Unity协程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考...

    Fflyqaq5892022-09-07
  • C#C#泛型详解及关键字作用

    C#泛型详解及关键字作用

    这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用,大家都知道泛型公共语言运行库是非...

    黄厚镇11382022-11-29
  • C#C#编写一个简单记事本功能

    C#编写一个简单记事本功能

    这篇文章主要为大家详细介绍了C#编写一个简单记事本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    卖画的作家10012022-01-25
  • C#C# 调用 JavaWebservice服务遇到的问题汇总

    C# 调用 JavaWebservice服务遇到的问题汇总

    本文给大家分享的是个人在使用C#调用 JavaWebservice服务遇到的几个问题的解决方法的汇总,给有类似需求的小伙伴们参考下吧。...

    C#教程网8142021-11-08