半路独行

c#进阶之浅析委托和事件

何为委托

加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型

public  void Write()
        {
            //TODO
        }
//加上关键字delegate,去掉方法体{}
public delegate void Write();

委托的使用

委托基础使用三部曲:1初始化声明的委托 2绑定定义的方法 3使用

绑定方法与声明的委托的参数签名必须一致(参数个数,对应类型,返回类型)

 class Program
    {
        //定义方法
        public static void WriteFun()
        {
            //TODO
        }
        public static void GetFun(int y)
        {
            //TODO
        }
        public static string SetFun()
        {
            return "";
        }
        //声明委托
        public delegate void Write();
        public delegate void Get(int x);
        public delegate string Set();

        static void Main(string[] args)
        {
            //初始化委托,绑定方法
            Write write = new Write(WriteFun);
            //可简写Write write = WriteFun;
            Get get = GetFun;
            Set set = SetFun;
            //直接使用或者用invoke()
            write();//write.Invoke();
            get(3);//get.Invoke(3);
            string str = set();//string str = set.Invoke();
        }
    }

多播委托

上面说过委托是方法列表:委托可以一次绑定多个方法,通过+=和-=来绑定和解除绑定;

 class Program
    {
        public static void WriteFun()
        {
            //TODO
        }
        public static void WriteFun1()
        {
            //TODO
        }
        public static void WriteFun2()
        {
            //TODO
        }

        public delegate void Write();

        static void Main(string[] args)
        {
            Write write = WriteFun;
            write += WriteFun;
            write -= WriteFun;
            write += WriteFun1;
            write += WriteFun2;
            write.Invoke();
        }
    }

委托和事件

委托是一种类型,事件是加了关键字event的委托实例

相比与上述的普通委托实例,事件更加特殊,它不能被初始化,且不能被外部调用

public class Button
    {

        public ButtonClickHandle ButtonClickHandle;
        public event ButtonClickHandle ButtonClickHandleEvent;

        public void click()
        {
            if (ButtonClickHandle !=null)
            {
                ButtonClickHandle.Invoke();
            }
            if (ButtonClickHandleEvent != null)
            {
                ButtonClickHandleEvent.Invoke();
            }
        }
    }
    public delegate void ButtonClickHandle();

区别如下

 不能被初始化和外部调用,这是一种权限控制的安全机制

PS

委托尽量不要自己去实现,一方面是官方已经提供了Func与Action两种有无返回的委托,基本够用;另一方面是,委托是一种类型,如果委托的类型过多,会造成泛滥且不能够通用

进阶

lambda表达式

 

出自:博客园-半路独行

原文地址:http://www.cnblogs.com/banluduxing/p/8999428.html

本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。

posted @ 2018-05-07 12:50  半路独行  阅读(238)  评论(0编辑  收藏  举报