zoukankan      html  css  js  c++  java
  • 委托与事件

    委托是一种类型;事件是委托的一个实例。委托的意义:异步多线程、逻辑分离

    public delegate string CateAction();//委托

    public event CateAction CateActionEvent;//事件

    事件只能在声明他的类内部调用(Invoke);委托可以在外部调用(Invoke);事件加了权限控制,保证事件不能在外部直接赋值和调用。

    事件执行前要判断不为null;

    public void CateEvent()
            {
                if (CateActionEvent!=null)
                {
                    //string result1 = CateActionEvent.Invoke();//顺序调用1,返回值是委托中最后一个函数的返回值
                    //string result2 = CateActionEvent();//顺序调用2,返回值是委托中最后一个函数的返回值
                    foreach (CateAction item in CateActionEvent.GetInvocationList())
                    {
                        string result3 = item.Invoke();//顺序调用3,可以获得每个函数的返回值
                        //item.BeginInvoke(null, null);//异步调用,多线程
                    }
                }
            }

    若委托的方法具有返回值,直接执行委托实例,得到的返回值是最后一个方法返回的;要想获得委托中每个方法的返回值,使用GetInvocationList()获得方法集合,逐个调用,像上面的循环;

    还有一个知识点就是,多播委托为变量配合lambda使用时,多个返回值只能返回最后一个值:

    //无参数,返回string类型
                Func<string> method = () => DateTime.Now.ToString();
                Console.WriteLine(method.Invoke());
    
                method += () => "1";
                method += () => "2";
                method += () => "3";
                method += () => "4";
                method += () => "5";
                method += Test1;
                Console.WriteLine(method.Invoke());//带返回值的多播委托,只能获得最后一个方法的返回值
    
                Console.Read();

    public static string Test1() { return "Test1"; }

    打印结果:2017/11/14 10:22:16   和  Test1

    参考:http://www.cnblogs.com/renzhitian/p/6080751.html

  • 相关阅读:
    二维线性表 list实现
    行测题
    邻接表
    链表中插入和删除结点
    linux监控指标和命令
    lr测试结果分析
    python 装饰器 decorator
    并查集 PID331 / 家族
    素数环 dfs+回溯
    catch the cow bfs
  • 原文地址:https://www.cnblogs.com/xsj1989/p/7799232.html
Copyright © 2011-2022 走看看