多播委托的理解
上节介绍的委托都是只包含一个方法的调用,其实委托可以包含N个方法的,调用时候以加入的顺序来进行。 可以使用 +=来将一个方法加入委托 -=从委托中删除一个方法的引用。
多播委托的注意事项之方法返回值
多播委托中,如方法有返回值的话,只能接收到最后一个方法调用的返回值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
Func<double, double> func = MathOperations.Square;
func += MathOperations.MultiplyByTwo;
Console.WriteLine(func(10)); //20
}
}
public class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
}
那么只能改写算术运算中的方法了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
Action<double> action = MathOperations.Square;
action += MathOperations.MultiplyByTwo;
action(10);
}
}
public class MathOperations
{
public static void MultiplyByTwo(double value)
{
Console.WriteLine(value*2);
}
public static void Square(double value)
{
Console.WriteLine(value * value);
}
}
}
还有一种解决方式,就是使用GetInvocationList方法来获得多播委托的调用序列
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
Func<double, double> func = MathOperations.Square;
func += MathOperations.MultiplyByTwo;
foreach (Func<double, double> item in func.GetInvocationList())
{
Console.WriteLine(item(10));
}
}
}
public class MathOperations
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
}
多播委托的注意事项之方法异常
我们将第一个求平方的方法抛出一个异常,发现委托将不能在继续执行下面的方法了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
Action<double> action = MathOperations.Square;
action += MathOperations.MultiplyByTwo;
try
{
action(10); //100 Square exception.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public class MathOperations
{
public static void MultiplyByTwo(double value)
{
Console.WriteLine(value*2);
}
public static void Square(double value)
{
Console.WriteLine(value * value);
throw new Exception("Square exception.");
}
}
}
那么将如何继续下去呢?使用委托中的GetInvocationList来获得多播委托的调用列表
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
Action<double> action = MathOperations.Square;
action += MathOperations.MultiplyByTwo;
foreach (Action<double> item in action.GetInvocationList())
{
try
{
item(10); //100 Square exception 20.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
public class MathOperations
{
public static void MultiplyByTwo(double value)
{
Console.WriteLine(value*2);
}
public static void Square(double value)
{
Console.WriteLine(value * value);
throw new Exception("Square exception.");
}
}
}