委托可以让方法作为参数传递给其他方法。可以用一个例子阐述这一问题。
-
首先定义一个委托类型,代码如下:
public delegate void MyDelegate();
-
然后在项目生成的Progran类中定义两个方法M1和M2
static void M1() { Console.WriteLine("方法一"); } static void M2() { Console.WriteLine("方法二"); }
-
然后再定义一个Test方法,方法中调用委托,随后又将参数d与M2方法关联。
static void Test(MyDelegate d) { //调用委托 if (d != null) { d(); } //改为与M2方法关联 d = M2; }
-
现在来进行测试调用,声明委托变量de并与M1方法关联,然后调用Test方法,在调用完Test方法后在调用一次委托变量de。最终得出如图所示结果。
MyDelegate de = M1; Test(de); de(); Console.ReadKey();
总结:利用Test方法中代码修改了参数d,与M2方法进行了关联,但是,当方法执行完成后,在方法外再次调用de,输出的仍然是"方法1"。因此,本示例不仅演示了如果通过委托实现将方法作为参数传递,同时也说明了委托类型在传递时是进行自我复制的 。参数d在方法内部被修改,并不影响方法外部的de变量。虽然委托是引用类型,但是方法内部让委托变量与M2方法进行了关联,就等于参数d引用了新的委托实例。而外部的委托变量传递给参数d时只是把委托的地址进行了自我复制,所以方法调用完成后,外部的变量引用的仍然是原来的委托实例。