Leo强
2020-05-27 16:29
采纳率: 100%
浏览 303

关于C#委托与事件的一道题目

请设计一个系统,该系统实现以下功能:

开关类(Switch):开关类用于控制电灯和计算机设备;
用Name字段表示开关的名称;
用Status属性表示开关的状态;
事件名称为Flip;

电灯类(Light):注册了一个开关事件,当关联的开关状态为On时,则电灯亮;
用Name字段表示电灯的名称;
用OnFlipCallBack表示Flip事件发生时调用的方法;

计算机类(Computer):注册了一个开关事件,当关联的开关状态为On时,则计算机打开;
用Name字段表示电灯的名称;
用OnFlipCallBack表示Flip事件发生时调用的方法;

在Main函数中实现以下功能:
定义两个开关对象s1,s2,其中:s1用于控制电灯l1,l2;s2用于控制计算机c1,c2,c3.

我对c#的委托与事件不太熟悉,有大佬可以帮忙解答一下,或者提供一下思路?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • Zelgius 2020-05-28 12:58
    已采纳

    C#中的委托你可以把它理解成是一种“允许你将方法(函数)作为变量进行保存,传递和使用”的功能。
    事件(event关键字)是针对委托的一种额外封装,有点类似public,private对一个变量的修饰。
    如果只是单纯的委托,你可以在类的外部直接对其进行调用(执行);但是如果你用event 关键字修饰过,那么这个你想执行这个委托只能在类内部,外部只能进行注册或者注销。
    比如我这边定义了一个很简单的委托:

        public delegate void OnDelegateCalled();
    
    

    然后我定义了一个类,里面有这个委托的实例:

        public class DelegateTest
        {
            public OnDelegateCalled DelegateCalled;
        }
    

    然后我在代码中使用:

                var delegateTest = new DelegateTest();
                delegateTest.DelegateCalled = new OnDelegateCalled(Console.WriteLine);
                delegateTest.DelegateCalled();
    

    这样做语法上没有任何问题,最后也可以顺利执行。在某些情境中也不会有逻辑问题。
    但是如果你把这个委托包装成一个事件的话,就不太一样了:

        public class DelegateTest
        {
            public event OnDelegateCalled DelegateCalled;
        }
    

    这时,如果你还想上面的代码那样,编译器是会报错的。它告诉你,DelegateCalled只能出现在+=或者-=的左边。也就是你要这样赋值:

                var delegateTest = new DelegateTest();
                delegateTest.DelegateCalled += Console.WriteLine;
    

    这个一般就叫注册一个事件。相对的-=就是注销。并且最后的调用也只能在DelegateTest这个类的内部进行。
    event关键字简单地说就是用来控制委托的赋值和调用时机的。

    就用你说的开关事件为例,原则上你只需要告诉我你按下开关时要做什么,然后你去按开关就行了。最后触发了哪些事件,按什么顺序触发的,是不需要你操心的。

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题