委托和事件的区别

委托和事件的区别

前言:在我们学习完委托和事件了,那我们需要想一想委托和事件到底有什么区别呢?如果不了解委托和事件的话请看我之前的博客.http://www.cnblogs.com/MoRanQianXiao/p/7767931.html%20http://www.cnblogs.com/MoRanQianXiao/p/7773911.html

首先我们先建立一个学习类,声明委托和事件。在这个类中有两个学习的方法。在构造函数中进行委托和事件的注册。并且写一个方法进行委托和事件的调用,我们在下面的类中委托和事件的注册和调用都没有什么区别。代码如下:

 

    /// <summary>
    /// 学习类
    /// </summary>
    public class Learn
    {

        //委托
        public Action actHandle;
        //事件
        public event Action eveEvent;

        /// <summary>
        /// 构造函数
        /// </summary>
        public Learn()
        {
            //委托的注册
            actHandle += Test1;
            actHandle += Test2;
            //事件的注册
            eveEvent += Test1;
            eveEvent += Test2;
        }

        public void Test1()
        {
            Console.WriteLine("Test1");
        }

        public void Test2()
        {
            Console.WriteLine("Test2");
        }

        /// <summary>
        /// 方法的调用  没有明显的区别
        /// </summary>
        public void CallMethod()
        {
            actHandle?.Invoke();
            eveEvent?.Invoke();
        }

    }

 


在下面的代码中,当我们在一个方法中进行委托的声明,而我们在方法的内部是不能声明局部的实例的。而且我们在下面的方法中当我们为一个方法传递参数的时候,我们可以把委托当作一个方法的参数来进行使用,而我们的事件不可以。

    /// <summary>
    /// 学习类
    /// </summary>
    public class Learn2
    {

        public void CallMathod2()
        {
            //定义委托的局部实例
            Action actHandle2 = Test1;
            actHandle2 += Test2;

            //视图定义事件局部实例??????------这是错误的!!!!

            //测试
            actHandle2.Invoke();

        }

        public void Test1()
        {
            Console.WriteLine("Test1");
        }

        public void Test2()
        {
            Console.WriteLine("Test2");
        }

        /// <summary>
        /// 把委托当作为一个方法的参数来使用
        /// </summary>
        /// <param name="actHandle"></param>
        public void Test3(Action actHandle)
        {
            actHandle?.Invoke();
        }

    }

总结:

1.委托可以声明为局部的变量,而事件只能作为类的一个成员(即字段)来使用。所以我们可以认为事件是委托的一个特殊的实例,即受限制的委托,不可以定义局部的事件实例(语法错误)。

2.委托可以作为方法的参数使用,而事件不可以。

 

posted @ 2017-11-16 19:11  丢了蜡笔小新会哭〆  阅读(537)  评论(0编辑  收藏  举报