委托与事件的区别

 

 事件有发送者和接收方。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。       在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。(浅显的说:例如,我要吃饭,事件的发送者是我,但我并不知道谁将做饭给我吃,是妻子呢,还是老妈呢,还是老爸呢等等。所以引出了委托,就是这个事件交给谁做。 

委托好比一个指挥官,指向妻子,妻子做,指向老妈,老妈做
Public delegate [返回值] delegatename(委托的名字)(参数列表……..)
Public event DelegateName(自定义的一个委托) MyClick;

事件是一种特殊的委托,因为事件是对委托的封装,就像字段被封装成属性,因为对于事件来讲内部永远是private的,外部只能“注册自己+=、注销自己-=”,在本类是可以用=的(赋值一个方法),外界不可以注销其他的注册者,外界不可以主动触发事件,从而起到封装的作用;而委托时可以=的,即赋值,这样委托就重新new了之前+=或者赋值的都不存在了,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。所以简单来说事件就是对委托的封装,防止外部类对其进行赋值;

 

 

namespace DelegateAndEvent

{

    public delegate void GreetingDelegae(string name);

    public class Manager

    {

        public GreetingDelegae delegate1;

        public event GreetingDelegae event1;

 

        public void Greeting(string name)

        {

            if (delegate1 != null)

                delegate1(name);

            if (event1 != null)

                event1(name);

            event1 = Test;//在定义事件的本类中时可以赋值的

        }

 

        public void Test(string name)

        {

        }

    }

}

 

 

 

 

namespace DelegateAndEvent

 

{

 

    /// <summary>

 

    /// MainWindow.xaml 的交互逻辑

 

    /// </summary>

 

    public partial class MainWindow : Window

 

    {

 

        public MainWindow()

 

        {

 

            InitializeComponent();

 

            Manager m = new Manager();

 

            m.delegate1 = English;//委托的话可以用=号,即赋值

 

            m.delegate1 += Chinese;

 

            m.delegate1 = Chinese;//如果是再加这句那么之前加的就都没有了,因为委托时public的,外部可以更改的,这是为什么要有event

 

            //因为event外部只能+=和-=,不能赋值,只有内部才可以赋值,这样就保护了该事件成员在外部不会被new了

 

            m.event1 += new GreetingDelegae(English);//不能=的,会出错

 

            m.event1 += new GreetingDelegae(Chinese);

 

        }

 

 

 

        public void English(string name)

 

        {

 

            MessageBox.Show("hello," + name);

 

        }

 

        public void Chinese(string name)

 

        {

 

            MessageBox.Show("你好," + name);

 

        }

 

    }

 

}

 

你可能感兴趣的:(区别)