美文网首页
C#委托、事件的定义及使用

C#委托、事件的定义及使用

作者: 浅谈码生活 | 来源:发表于2020-08-31 09:57 被阅读0次

    在和大家讨论“委托”,“事件”,“lambda”及“linq”可能会使用更多的代码来表现具体的使用方式和大致原理。
    委托声明
    1.)可以声明在类的外面也可以在类的内部。
    2.)委托跟方法很像,可以有返回值,有参数,用一个delegate关键字修饰。
    3.)委托的本质其实是一个类,继承自MulticastDelegate特殊类 。

    public delegate void NoReturnNoPara();
    public delegate void NoReturnWithPara(int x, int y);
    public delegate int WithReturnNoPara();
    public delegate int WithReturnWithPara(out int x, ref int y);
    

    Action / Func
    1.)Action:是系统给我们提供的一个委托;是一个没有返回值,可以有参数的委托;最多可以有16个泛型参数;
    2.)Func:是系统给我们提供的一个委托;是一一个必须有返回值的委托,可以有参数的委托;最多可以有16个泛型参数;

    //有参数,无返回值
    public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 Arg17);
    //可以传参数,有返回值
    public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);
    

    事件
    1.)事件其实是委托+event关键字,事件只能在声明当前这件事的类内部Invoke;
    2.)事件其实是委托的一个实例,事件比委托更加安全;
    下面是物品涨价通知,消费购买的一个发布订阅的示例

    //事件的发布者,发布是按并且在满足条件的情况下,触发事件
    public class FrameworkClass
    {
                public int Id { get; set; }
                public string Name { get; set; }
                private int _price = 9;
                public int Price
                {
                    get
                    {
                        return _price;
                    }
                    set
                    {
                        if (value > _price)
                        {
                            PriceIncrease.Invoke(this, new FrameworkEventArge()
                            {
                                OldPrice = _price,
                                NewPrice = value
                            });
                        }
                        _price = value;
                    }
                }
                public event EventHandler PriceIncrease;
            }
    }
    // 订户,关注事件,事件触发之前,超市做出点动作
    public class Supermarket
    {
       public void Extension(object sender, EventArgs e)
        {
              FrameworkClass frameworkClass = (FrameworkClass)sender;
              FrameworkEventArge eventArge = (FrameworkEventArge)e;
              Console.WriteLine($"this is {frameworkClass.Name}");
              Console.WriteLine($"{frameworkClass.Name}之前的价格是{eventArge.OldPrice}");
              Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
              Console.WriteLine("超市宣传。。。"); 
          }
    }
    // 订户: 关注事件,事件触发后,自己做出相应的动作
    public class CustomInfo
    {
        public void Buy(object sender, EventArgs e)
         {
               FrameworkClass frameworkClass = (FrameworkClass)sender;
               FrameworkEventArge eventArge = (FrameworkEventArge)e;
               Console.WriteLine($"this is {frameworkClass.Name}");
               Console.WriteLine($"{frameworkClass.Name}之前的价格是{eventArge.OldPrice}");
               Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
               Console.WriteLine("果断买了。。。");
               Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
          }
    }
    //订阅:就是个订户和事件发布者关联起来
    Product.PriceIncrease += new Supermarket().Extension;
    Product.PriceIncrease += new CustomInfo().Buy;
    Product.Price = 10;
    

    相关文章

      网友评论

          本文标题:C#委托、事件的定义及使用

          本文链接:https://www.haomeiwen.com/subject/cptusktx.html