• 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 转载请注明出处。

  • 相关阅读:
    datagridview中读取数据判断+考勤每月上班天数判断
    dateTimePicker日期比较+时间段内查询+员工查询薪资步骤+datagridview
    c#word 存取
    位图去空白
    过桥问题
    Dominos 2(DFS)(容器)
    poj 3421(三分)
    poj 3186(DP)
    安装Ubuntu
    poj 3273(二分)
  • 原文地址:https://www.cnblogs.com/banluduxing/p/8999428.html
Copyright © 2020-2023  润新知