在和大家讨论“委托”,“事件”,“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;