第七章-委托

来源:互联网 发布:td lte无线网络优化 编辑:程序博客网 时间:2024/06/05 17:58

当要把方法传送给其他方法时,需要使用委托。
1>定义委托
(1)定义委托的语法如下:

```
delegate void IntMethodInvoker(int x);
```

定义了一个委托 IntMethodInvoker,并指定该委托的每个实例都包৿
一个方法的细节,该方法带有一个 int 参数,并返回 void。在定义委托时,必须给出它所代表的方法签名和返回类型的全部细节。
提示:理解委托的一种好方式是把委托当作给方法签名和返回类型指定名称。
(2)定义一个委托 TwoLongsOp,该委托代表的方法有两个 long 型参数,返回类型为 double。

```
delegate double TwoLongsOp(long first, long second);
```

定义一个委托,它代表的方法不带参数,返回一个 string 型的值,

```
delegate string GetAString();
```

1,定义的前面要加上关键字 delegate。
2,可以在定义类的任何地方定义委托,既可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为顶层对象。
3,可以在委托定义上添加一般的访问修饰符: public、 private 和
protected

```
public delegate string GetAString();
```

委托实现为派生于基类 System.Multicast Delegate 的类, System.MulticastDelegate 又派生于基类 System.Delegate。

2>使用委托
(1)在 int 上调用 ToString()方法的一种相当冗长的方式:

```
private delegate string GetAString();
static void Main
{
int x = 40;
GetAString firstStringMethod = new GetAString(x.ToString);
Console.WriteLine("String is" + firstStringMethod());
```

代码中,实例化了类型为 GetAString 的一个委托,并对它进行初始化,使它引用整型变量 x 的 ToString()方法。
C#中,委托在语法上总是带有一个参数的构造函数,这个参数就是委托引用的方法。

注意, int.ToString()是一个实例方法(不是静态方法),所以需要指定实例(x)和方法名来正确初始化委托。

3>委托示例
(1)定义一个类 MathsOperations,它有两个静态方法,对 double 类型的值
执行两个操作,然后使用该委托调用这些方法。

```
class MathsOperations
{
public static double MultiplyByTwo(double value)
{
return value*2;
}
public static double Square(double value)
{
return value*value;
}
}
```

调用这些方法:

```
delegate double DoubleOp(double x);
class MainEntryPoint
{
static void Main()
{
DoubleOp [] operations =
{
new DoubleOp(MathsOperations.MultiplyByTwo),
new DoubleOp(MathsOperations.Square)
};
for (int i=0 ; i<operations.Length ; i++)
{
Console.WriteLine("Using operations[{0}]:", i);
ProcessAndDisplayNumber(operations[i], 2.0);
ProcessAndDisplayNumber(operations[i], 7.94);
ProcessAndDisplayNumber(operations[i], 1.414);
Console.WriteLine();
}
}
static void ProcessAndDisplayNumber(DoubleOp action, double value)
{
double result = action(value);
Console.WriteLine("Value is {0}, result of operation is {1}", value, result);

}
}
```

代码中,实例化了一个委托数组 DoubleOp (记住,一旦定义了委托类,就可以实例化它的实例,就像处理一般的类那样—— 所以把一些委托的实例放在数组中是可以的)。该数组的每个元素都初始化为由 MathsOperations 类执行的不同操作。然后循环这个数组,把每个操作应用到 3 个不同的值上。这说明了使用委托的一种方式—— 把方法组合到一个数组中,这样就可以在循环中调用不同的方法了。
代码的关键一行是把委托传递给 ProcessAndDisplayNumber()方法,例如:

```
ProcessAndDisplayNumber(operations[i], 2.0);
```

其中传递了委托名,但不带任何参数.
0 0