委托和事件
将方法作为参数传递给另外一个方法,就必须把方法的细节封装在一种新的类型的对象中,即委托。委托只是一种特殊的对象类型,其特殊之处在于,我们之前定义的所有对象基本都包括数据,而委托包含的只有方法的地址。
在C#中使用一个类时,分为2个阶段。首先要定义这个类,即告诉编译器这个类由什么字段和方法组成。然后(除非使用静态方法)实例化类的一个对象。使用委托时,也需要这2个步骤。首先定义要使用的委托,对于委托,定义它就是要告诉编译器这种类型的委托代表了哪种类型的方法,然后创建该委托的一个或者多个实例。编译器在后台将创建表示该委托的一个类。
定义委托的语法如下:
delegate void IntMethodInvoker(int x);
在这个实例中,定义了一个委托IntMethodInvoker,并指定该委托的每个实例都包含一个方法的细节,该方法带有一个int参数,并返回void。理解委托的一个要点是他们的类型是安全性非常高。在定义委托时必须给出它代表的方法签名和返回类型等全部细节。理解委托的一种好方式就是把委托当做给方法签名和返回类型指定名称。
因为定义委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托,既可以在另外一个类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为顶层对象。可以在委托定义上田间一般的访问修饰符:public, private,protected等。
实际上,定义一个委托是指定义一个新类。委托实现为派生自基类System.MulticastDelegate的类。System.MulticastDelegate又派生自基类System.Delegate。C#编译器知道这个类,会使用其委托语法,因此我们不需要了解这个类的具体执行情况,这是C#与基类共同合作,是编程更容易完成的另一个实例。并且在术语方面。类有2个不同的术语:“类”表示较广义的定义,“对象”表示类的实例。但是委托只有一个术语,在创建委托的实例时,所创建的委托的实例仍称为委托,必须从上下文中确定委托的确切含义。
在C#中,委托在语法上总是带有一个参数的构造函数。这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。如:
private delegate string GetAString();
?
static void Main(){
int x=80;
GetAString firstmethod = new?GetAString (x.ToString); //不能是x.ToString(),要是这样就会返回一个字符串,而不是方法的引用
Console.WriteLine("String is {0}",?firstmethod());
}