读书人

小白大家看错在哪

发布时间: 2012-03-16 16:34:56 作者: rapoo

小白求教:大家看错在哪?
刚学委托,写了下面的一段代码:

C# code
namespace Pra_Delegate3{    delegate double MathsOp(double x);  //定义一个委托    class Program    {        static void Main(string[] args)        {            //Mydelegate myDelegate = new Mydelegate();            MathsOp operation = new MathsOp(Mydelegate.MultiplyBy2);//实例化            operation += new MathsOp(Mydelegate.AddBy2);            double x = 1.23;            double result = operation(x);            Console.WriteLine("{0} multiply by 2 is {1}",x,result);            operation -= new MathsOp(Mydelegate.MultiplyBy2);            Console.WriteLine("{0} add by 2 is {1}",x,result);            Console.Read();        }        public class Mydelegate        {            public static double MultiplyBy2(double x)            {                return x * 2;            }            public static double AddBy2(double x)            {                return x + 2;            }        }    }}

输出结果:
1.23 multiply by 2 is 3.23
1.23 add by 2 is 3.23

[解决办法]
使用多重委托要求返回值为void, 不然的话有多个返回,系统怎么知道你须要哪一个
[解决办法]
你得改一下,向这养就可以了

delegate double MathsOp(double x);

class Program
{
static void Main(string[] args)
{
MathsOp operation = new MathsOp(Mydelegate.MultiplyBy2);
operation += new MathsOp(Mydelegate.AddBy2);
double x = 1.23;
double result = operation(x);
Console.WriteLine("{0} Add by 2 is {1}", x, result);
operation -= new MathsOp(Mydelegate.AddBy2);
result = operation(x);
Console.WriteLine("{0} Multiply by 2 is {1}", x, result);
Console.Read();
}

public class Mydelegate
{
public static double MultiplyBy2(double x)
{
return x * 2;
}

public static double AddBy2(double x)
{
return x + 2;
}
}

}

[解决办法]
MathsOp operation = new MathsOp(Mydelegate.MultiplyBy2);//实例化
operation += new MathsOp(Mydelegate.AddBy2);
这两步产生了operation的多播代理,实际上你先后调用了MultiplyBy2和AddBy2(顺续并不一定)。
相当于下面两步
result = 1.23 * 2;
result = 1.23 + 2;
所以
输出结果:
1.23 multiply by 2 is 3.23

[解决办法]
C# code
MathsOp operation = new MathsOp(Mydelegate.MultiplyBy2);//实例化operation += new MathsOp(Mydelegate.AddBy2);
[解决办法]
不过,用+=时你要清楚你再做什么。对于普通的委托,没有什么大碍。如果是事件,就有所不同了,被注册的回调都会响应的。
[解决办法]
2楼的办法治标不治本,根据文档多播发生的顺序是不一定的(虽然看起来有序)。
根据楼主的需求应该不是要多播。
[解决办法]
因为第一次显示的时候,委托连上有2个方法,所以它返回了链上最后的方法调用,然后你又把链上的方法去掉了一个,链上还有一个方法,所以,还是一样的

读书人网 >C#

热点推荐