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

2020-08-31  本文已影响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;
上一篇 下一篇

猜你喜欢

热点阅读