一、在C#中声明委托
定义委托和方法雷同,但是没有方法体,定义的前面要加上关键字delegate:delegate string GetText();。根据定义的可见性,可以在委托定义上添加一般的访问修饰符:public、private和protected等:public delegate string GetText();。因为定义委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托,即可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为顶层对象:
注意:实际上,“定义一个委托”是指“定义一个新类”。委托实现为派生于基类System.MulticastDelegate的类,System.MulticastDelegate又派生于基类System.Delegate。委托的实例仍称为委托。
二、在C#中使用委托
在C#中,委托在语法上总是带有一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。下面在int上调用Tostring()方法的一种相当冗长的方式:
public delegate string GetString();
static void Main(string[] args)
{
int x = 40;
GetString text = new GetString(x.ToString);
Console.WriteLine("String is " + text());
}
注意:在任何代码中,都应提供委托实例的名称,后面的括号中应包含调用该委托中的方法时使用的参数。
提示:给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法----主要方法的签名匹配于委托的签名即可。
三、匿名方法
匿名方法是用作委托参数的一个代码块。
匿名方法的优点是减少了系统开销。方法仅在由委托使用时才定义。在为事件定义委托时,这是非常显然的。
在使用匿名方法时,必须遵循两个规则:
1、在匿名方法中不能使用跳转语句跳到该匿名方法的外部,反之亦然。
2、在匿名方法内部不能访问不安全的代码。另外,也不能访问在匿名方法外部使用的ref和out参数。但可以使用在匿名方法外部定义的其他变量。
四、多播委托:包含多个方法的委托。
多播委托必须返回void。实际上,如果编译器发现某个委托返回void,就会自动假定这是一个多播委托。
多播委托识别+、+=(在委托中添加方法调用)和-、-=(在委托中删除方法调用)。
- delegate void DoubleOp(double x);
-
class MainEntryPoint
-
{
-
static void Main()
-
{
-
DoubleOp operations = new DoubleOp(MathsOperations.MultiplyByTwo);
-
operations += new DoubleOp(MathsOperations.Square);
-
/*等同上面
-
DoubleOp operation1 = new DoubleOp(MathsOperations.MultiplyByTwo);
-
DoubleOp operation2 = new DoubleOp(MathsOperations.Square);
-
DoubleOp operations = operation1 + operation2;
-
*/
-
}
- }//【其他部分见实例篇-->实例一】
注意:如果使用多播委托,就应注意对同一个委托调用方法链的顺序并未正式定义,因此应避免编写依赖于以任意特定顺序调用方法的代码。