欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解C#基础:委托和事件的比较

最编程 2024-01-21 09:34:24
...
    class Class3
    {
        public static void ClassA_Test(int i)
        {
            Console.WriteLine("Class3:"+i);
        }
    }
区别一:是否是一个类型
    class Class3
    {
    static void Main(string[] args)
    {
        //委托正确使用
        Class1.NumberChanger n1 = Class2.ClassA_Test;
        //事件使用 编译器报错
        Class1.changer handle2 = Class2.ClassA_Test;
    }

错误:Class1.changer 是“字段”,但此处被当做“类型”来使用


区别二:委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用。

(1)在类外部调用委托

网络异常,图片无法展示
|

(2)在类外部调用事件

网络异常,图片无法展示
|


事件“ClassC.Say_EventHandler”只能出现在 += 或 -= 的左边(从类型“ClassC”中使用时除外)


区别三:委托可以在外部类使用 = 来赋值,事件只能在内部类用 = 赋值,外部类不可以

image.png


从编译器提示的错误,我们可以了解到,事件只能在声明它的类内部被调用。从事件本身来讲,事件一般用于类自身的属性变化时,用来通知外界自身的变化的。我们将对ClassC内部的一个属性赋值,然后调用事件,模拟对外通知。代码如下所示

image.png


总结 ????

事件的使用方式跟委托没什么区别,事件就相当于一个加了"event"修饰符的委托,在加了这个修饰以后,委托的部分功能就相当于被阉割了。通过这个加了修饰符以后,我们可以更好的控制注册和注销,对于一个外部类来说,它就只能通过"+=/-="注册自己和注销自己,而且外界也不能主动触发一个事件。


委托一般用于回调,而事件用于外部接口。例如在观察者模式中,在被观察者中可以声明一个事件作为外部观察者注册的接口。

同时,这个事件只能在被观察者内部触发,而观察者中无法触发该事件,从而保证了安全性。


说了这么多,总结起来就一句话:事件与委托最主要的区别应该是不能在外部调用,但可以通过+=或-=进行注册,但如果委托变量为私有,则外部不能注册;如果为公有,则外部有可以调用,破坏了封装,所以没办法,在这种情况就定义一个event就好了


推荐阅读