陷阱1:“委托链在执行期间可以(根据业务需要)动态增减其中委托实例”
委托链是由委托对象(实例)构成的一个集合。利用委托链,可依次调用集合中委托所代表的全部方法。
"+="、"-="操作符常用来简化委托链的构造,它们分别表示向委托链中增加一个委托对象和从委托链中移除一个委托对象。
委托链构造的便捷性给开发者设下了一个优美的陷阱。有不少同学(包括我自己)认为,在委托链依次执行的过程中,我们可以根据某种逻辑规则来决定是否让委托链继续执行。示例代码如下:
public class Class1 { /// <summary> /// 委托类型 /// </summary> /// <param name="ismove">是否向下执行的标识</param> public delegate void Print(ref string ismove); /// <summary> /// 委托实例 /// </summary> Print p; /// <summary> ///默认构造函数 /// </summary> public Class1() { //添加四个方法 p = new Print(method1);//第一个方法用来实例化委托第一个实例 p += method2; p += method3; p += method4; } /// <summary> /// 开始执行委托链 /// </summary> /// <returns></returns> public string run() { string ismove = "yes"; p(ref ismove); return ismove; } public void method1(ref string ismove) { Console.WriteLine("method1"); if (ismove == "yes")//判断是否要继续向下执行 { } } public void method2(ref string ismove) { Console.WriteLine("method2"); if (ismove == "yes")//判断是否要继续向下执行 { //这里已经处理完所有的逻辑,不需要在调用后面的调用 p -= method3; //移除方法3 p -= method4;//移除方法4 } } /***********************后面的方法都不会被调用******************************************/ public void method3(ref string ismove) { Console.WriteLine("method3"); if (ismove == "yes")//判断是否要继续向下执行 { } } public void method4(ref string ismove) { Console.WriteLine("method4"); if (ismove == "yes")//判断是否要继续向下执行 { } } } |
我们对委托链的充满了信心,“肯定”在调用run()方法后可以看到会是:
“
method1
method2
”
那委托链到底表现如何?请看下图:
可以清楚的看到,此时我们已经在陷阱底部了。
仰起头向着洞口喊道“我问天,我问地,我要问问委托我为何不如我心意。”哈哈,还是问问自己吧。