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

    https://blog.csdn.net/wnvalentin/article/details/81840339
    ◆ 定义委托:
    [访问修饰符] delegate 返回值类型 委托名 (形参列表);
    ◆ 委托实例化:
    1、委托类名 委托实例名 = new 委托类名(target);
    2、委托类名 委托实例名 = Target ;
    Target 是传入的方法名称,是方法的引用,不能带()。
    ◆ 委托实例调用:
    1、使用反射的Invoke()方法调用委托实例;
    2、直接在委托实例后加上()进行调用

    ◆ 泛型委托:
    Func<T>委托 、Action<T>委托 和 Predicate<t>委托。

    ◆ Func<T>委托

    Func<T>委托代表着拥有返回值的泛型委托。
    Func<T>有一系列的重载,形式如 Func<T1,T2, ... TResult>,其中TResult代表委托的返回值类型
    其余均是参数类型。只有一个T时,即Func<TResult>,代表该委托是无参数的。
    .NET封装了最多16个输入参数的Funct<>委托。

    ◆ Action<T>委托代表返回值为空 void 的委托,它也有一些列重载,最多拥有16个输入参数。用法与Func<T>相同。

    ◆ 匿名委托:
    委托类名 委托实例名 = delegate(args){方法体代码};

    ◆ 表达式Lambda
    委托类名 委托实例名 = (参数1,参数2...) => {方法体代码};

    当匿名还是只有一行代码是,可采用这种形式。
    CompareDelegate LambdaCompare = (s4,s5)=> s4.Age <= s5.Age;
    其中 => 符号的左侧是参数,右侧是要返回或者执行的语句。参数需放在括号内,只有一个参数可省
    略括号。

    多行代码时:
    CompareDelegate LambdaCompare = (s4,s5) =>
    {
      return s4.Age <= s5.Age; //不可省略return;
    };

    Func<int> fun1 = new Func<int>(FunWithNoPara);   int result1= fun1();
    Func<int> fun2 = delegate { return 19; };       int result2 = fun2();
    Func<int> fun3 = () => { return 3; };           int result3 = fun3();
    Func<int> fun3 = () => { return 3; };           int result3 = fun3();
    // 使用委托
    Func<int, string> fun5 = delegate (int i) { return i.ToString(); };      string result5 = fun5(5);
    // 使用匿名委托
    Func<int, string> fun6 = (int i) => 
    {
        return i.ToString();
    };
    string result6 = fun6(6);
    // 多个输入参数
    Func<int, string, bool> fun7 = new Func<int, string, bool>(FunWithMultiPara);
    bool result7 = fun7(2, "2");
    // 使用委托
    Func<int, string, bool> fun8 = delegate (int i, string s) 
    {
       return i.ToString().Equals(s) ? true : false;
    };
    bool result8 = fun8(2, "abc");
    // 使用匿名委托
    Func<int, string, bool> fun9 = (int i, string s) => 
    {
         return i.ToString().Equals(s) ? true : false;
    };
    bool result9 = fun9(45, "ert");

    事件使用

    using System;
    
    namespace Test
    {
        static class Program
        {
            static void Main()
            {
                刘备 lb = new 刘备();
                关羽 gy = new 关羽(lb); //可以理解为, 刘备与关羽约定好摔杯杀出, 然后关羽自己注册事件
                张飞 zf = new 张飞(lb); //同上
                //刘备摔杯
                lb.摔杯方法();
            }
        }
    
        public class 刘备
        {
            public delegate bool 摔杯委托(string str);
            public event 摔杯委托 摔杯事件;
    
            public void 摔杯方法()
            {
                if (摔杯事件 != null)
                    摔杯事件("猛猛的摔杯 (只是示例个参数)");
            }
        }
    
        public class 关羽
        {
            public 关羽(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("关羽带300刀斧手从北门杀出!");
                return true;
            }
        }
    
        public class 张飞
        {
            public 张飞(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("张飞带300刀斧手从南门杀出!");
                return true;
            }
        }
    }
  • 相关阅读:
    python day03--字符串
    python day02--运算符,编码
    python day01
    数据库:对 null 和notnull,单表操作,多表操作 。
    数据库的介绍
    数据库对表的操作练习。
    数据库基础知识:介绍
    并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。
    Event事件,进程池与线程池,高性能爬取梨视频,协程,协程的目的,gevent。
    GIL全局解释器锁,多线程的作用,死锁现象,信号量(了解),线程队列。
  • 原文地址:https://www.cnblogs.com/lanyubaicl/p/11040580.html
Copyright © 2011-2022 走看看