为什么要使用什么我可以做代表的事件? [英] Why use events for what I can do with Delegates?

查看:167
本文介绍了为什么要使用什么我可以做代表的事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道活动始终与代表联系。但是,我缺少一些核心使用事件,并试图理解这一点。

我创建了一个简单的事件程序,如下图,和它的作品完美的罚款。

 命名空间CompleteRef3._0
{
委托无效someEventDelegate();

类EventTester
{
    公共事件someEventDelegate someEvent;

    公共无效doEvent()
    {
        如果(!someEvent = NULL)someEvent();
    }

}

类节目
{
    静态无效EventHandler1()
    {
        Console.WriteLine(事件处理函数1名为..);
    }

    静态无效EventHandler2()
    {
        Console.WriteLine(事件处理2名为..);
    }
    静态无效EventHandler3()
    {
        Console.WriteLine(事件处理函数3名为..);
    }


    静态无效的主要(字串[] args)
    {
        EventTester EVT =新EventTester();
        evt.someEvent + = EventHandler1;
        evt.someEvent + = EventHandler2;
        evt.someEvent + = EventHandler3;
        evt.doEvent();
        Console.ReadKey();

    }
}
}
 

我取代了事件声明中使用委托。这是我更换了行的公共事件someEventDelegate someEvent; someEventDelegate someEvent; 以上程序,我仍然得到同样的结果。现在,我很困惑,为什么我们需要使用活动,如果可以仅通过委托来实现。什么是真正的使用事件?

无事件修改后的方案如下 -

 命名空间CompleteRef3._0
{
委托无效someEventDelegate();

类EventTester
{
    someEventDelegate someEvent;

    公共无效doEvent()
    {
        如果(!someEvent = NULL)someEvent();
    }

}

类节目
{
    静态无效EventHandler1()
    {
        Console.WriteLine(事件处理函数1名为..);
    }

    静态无效EventHandler2()
    {
        Console.WriteLine(事件处理2名为..);
    }
    静态无效EventHandler3()
    {
        Console.WriteLine(事件处理函数3名为..);
    }


    静态无效的主要(字串[] args)
    {
        EventTester EVT =新EventTester();
        evt.someEvent + = EventHandler1;
        evt.someEvent + = EventHandler2;
        evt.someEvent + = EventHandler3;
        evt.doEvent();
        Console.ReadKey();

    }
}
}
 

解决方案

当然,你可以使用,因为在幕后代表的事件是,包装一个委托的构建。

但使用事件,而不是代表的基本原理是一样的,使用领域的性质,而不是 - 的数据封装的。这是不好的做法,暴露领域(无论他们是 - 原始字段或委托)。直接

顺便说一句,您将委托​​场,使人们有可能在第二个片段之前错过了公开关键字。

另外一个的方式与第二个片段:对代表你应该使用 Delegate.Combine 而不是+ =

I know Events are always associated with Delegates. But, I am missing some core use of Events, and trying to understand that.

I created a simple Event program, as below, and it works perfectly fine.

namespace CompleteRef3._0
{
delegate void someEventDelegate();

class EventTester
{
    public event someEventDelegate someEvent;

    public void doEvent()
    {
        if (someEvent != null) someEvent();
    }

}

class Program
{
    static void EventHandler1()
    {
        Console.WriteLine("Event handler 1 called..");
    }

    static void EventHandler2()
    {
        Console.WriteLine("Event handler 2 called..");
    }
    static void EventHandler3()
    {
        Console.WriteLine("Event handler 3 called..");
    }


    static void Main(string[] args)
    {
        EventTester evt = new EventTester();
        evt.someEvent += EventHandler1;
        evt.someEvent += EventHandler2;
        evt.someEvent += EventHandler3;
        evt.doEvent();
        Console.ReadKey();

    }
}
}

I replaced the event declaration with delegates. That is I replaced the line public event someEventDelegate someEvent; with someEventDelegate someEvent; on the above program, and I still get the same result. Now, I was confused why we need to use Events, if it can be achieved by Delegates only. What is the real use of Events?

The modified program without events is as below -

namespace CompleteRef3._0
{
delegate void someEventDelegate();

class EventTester
{
    someEventDelegate someEvent;

    public void doEvent()
    {
        if (someEvent != null) someEvent();
    }

}

class Program
{
    static void EventHandler1()
    {
        Console.WriteLine("Event handler 1 called..");
    }

    static void EventHandler2()
    {
        Console.WriteLine("Event handler 2 called..");
    }
    static void EventHandler3()
    {
        Console.WriteLine("Event handler 3 called..");
    }


    static void Main(string[] args)
    {
        EventTester evt = new EventTester();
        evt.someEvent += EventHandler1;
        evt.someEvent += EventHandler2;
        evt.someEvent += EventHandler3;
        evt.doEvent();
        Console.ReadKey();

    }
}
}

解决方案

Sure, you can use delegates because behind the scenes an event is a construct that wraps a delegate.

But the rationale of using events instead of delegates is the the same as for using properties instead of fields - data encapsulation. It's bad practice to expose fields (whatever they are - primitive fields or delegates) directly.

By the way, you missed a public keyword before your delegate field to make it possible in the second snippet.

Another "by the way" with the second snippet: for delegates you should use Delegate.Combine instead of "+=".

这篇关于为什么要使用什么我可以做代表的事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆