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

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

posted on 2017-11-07 16:00  邢帅杰  阅读(143)  评论(0编辑  收藏  举报