委托和事件

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;
        }
    }
}

 

posted @ 2019-06-17 16:42  蓝雨冰城  阅读(149)  评论(0编辑  收藏  举报