委托2
//这就声明了一个委托,意义:任何一个返回值为void,且只有一个形参为double的方法,都可以用这个委托来调用。
delegate void MathsOp(double x);//1、声明一个委托
public class MyDelegate
{
public static void MultiplyBy2(double value)
{
double result = value * 2;
Console.WriteLine("Multiplying by 2: {0} gives {1}", value, result);
}
public static void Squre(double value)//被委托的方法,必须与委托一致,即返回值及参数要一致
{
double result = value * value;
Console.WriteLine("Squaring: {0} gives {1}", value, result);
}
public static void Test(double value)//被委托的方法,必须与委托一致,即返回值及参数要一致
{
double result = value * 3.13;
Console.WriteLine("Test: {0} *3.14 得 {1}", value, result);
}
}
class Start
{
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp(MyDelegate.MultiplyBy2);//2、实例化委托,即把MyDelegate.MultiplyBy2 委托给operation
operation += new MathsOp(MyDelegate.Squre);//3、再把MyDelegate.Squre委托给operation , +=来向委托添加调用方法
operation += new MathsOp(MyDelegate.Test);
operation += new MathsOp(MyDelegate.Test);//可以多次调用
double x = 1.23;
operation(x);//4调用委托
operation -= new MathsOp(MyDelegate.MultiplyBy2);//取消MyDelegate.Squre委托 ,-=删除其中的调用方法
operation -= new MathsOp(MyDelegate.Test);
operation -= new MathsOp(MyDelegate.Squre);//不能把所有的委托删除
if (operation != null)
{
operation(x);
}
//注意,多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方。
//对此,我做了一个测试:如果不将委托的声明返回void,则返回值返回的是最后一个链入委托链的方法的返回值,编译不会出错。
Console.Read();
}
}

浙公网安备 33010602011771号