C# 深入浅出 委托与事件
C#中的委托和事件的概念接触很久了,但是一直以来总没有特别透彻的感觉,现在我在这里总结一下:
首先我们要知道委托的由来,为什么要使用委托了?
我们先看一个例子:
假设我们有这样一个需求,需要计算在不同方式下的总价,如下面代码所示,这里假设只有两种方式,一种是正常价格,,一种是折扣价格:
1 public enum CalcMethod 2 { 3 Normal, 4 Debate 5 } 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 CalcPrice(10, 100,CalcMethod.Normal); 11 CalcPrice(10, 100, CalcMethod.Debate); 12 Console.ReadLine(); 13 } 14 15 /// <summary> 16 /// 计算总价 17 /// </summary> 18 /// <param>数量</param> 19 /// <param>单价</param> 20 public static double CalcPrice(int count,int price,CalcMethod method) 21 { 22 switch (method) 23 { 24 case CalcMethod.Normal: 25 return NormalPrice(count, price); 26 case CalcMethod.Debate: 27 return DebatePrice(count, price); 28 default: 29 return 0; 30 } 31 } 32 33 public static double NormalPrice(int count,int price) 34 { 35 Console.WriteLine("正常的价格是:{0}", count * price); 36 return count * price; 37 } 38 public static double DebatePrice(int count, int price) 39 { 40 Console.WriteLine("折扣的价格是:{0}", count * price*0.7); 41 return count * price*0.7; 42 } 43 }
View Code但是我们想一想,如果还要增加总价计算方式,那么我们是不是要不断的修改CalcPrice方法,CalcMethod枚举呢?
那么是不是有更好的方式呢?
我们可以把真正的计算价格的方式委托给一个函数来计算,这样委托就诞生了。
首先我们定义一个跟方法参数和返回值类型一样的委托类型:
public delegate double CalcPriceDelegate(int count, int price);
然后修改计算方法:
/// <summary>
/// 计算总价
/// </summary>
/// <param>数量</param>
/// <param>单价</param>
public static double CalcPrice(int count, int price, CalcPriceDelegate calcDelegate)
{
return calcDelegate(count, price);
}
然后调用的时候直接用签名相同的方法传递就可以了:
CalcPrice(10, 100, NormalPrice);
CalcPrice(10, 100, DebatePrice);
到这里我们大体明白了委托可以使用方法作为参数,这样就避免了程序中出现大量的条件分支语句,程序的扩展性好。
接下来我要对委托做一个深入的探讨:
委托首先其实也是一个类,
public delegate double CalcPriceDelegate(int count, int price);
上面这句话其实就是申明一种委托类型,这个类型在编译的时候会生成以下成员:
1)public extern CalcPriceDelegate(object @object, IntPtr method);
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70573.html
- 上一篇:C# 数据结构 栈 Stack
- 下一篇:WPF 弱事件