委托是一个对象,它知道如何调用一个方法。
委托类型和委托实例
委托类型定义了委托实例可以调用哪类方法,具体来说,委托类型定义了方法返回的类型和参数。
委托的实例其实就是调用者的委托:
调用者调用委托,然后委托调用目标方法。
你可以理解为函数指针。或者理解为C语言里面goto就行了,它反正就是指向了一个方法。
直接上代码:
public class Program
{
delegate int Transformer(int x);
static int Square(int x) => x * x;
static void Main(string[] args)
{
Transformer t = Square;
int result = t(3);
Console.WriteLine(result);
Console.ReadKey();
}
}
简写1:
Transformer t = Square;
Transformer t = new Transformer(Square);
简写2:
t(3);
t.Invoke(3);
输出结果:
9
注意:
方法是在运行时才赋值给委托变量的。
编写出插件式方法:
//声明委托
public delegate int Transformer(int x);
public class Util
{
//定义一个静态方法2
public static void Transform(int[] values, Transformer t)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = t(values[i]);
}
}
}
public class Program
{
//定义一个静态方法1
static int Square(int x) => x * x;
static void Main(string[] args)
{
int[] values = { 1, 2, 3 };
Util.Transform(values, Square);
foreach(int i in values)
{
Console.WriteLine($"{i}");
}
Console.ReadKey();
}
}
输出结果:
1
4
9
委托变量使用+或+=操作符时,其操作数可以是null。就相当于把一个新的值赋给了委托变量。
SomeDelegate d=null;
d+=SomeMethod1;
相当于
d=SomeMethod1;
对单个目标方法的委托变量,使用-=操作符时,就相当于把null赋值给了委托变量。
多播:
public delegate int Transformer(int x);
public class Program
{
static int Square(int x)
{
var result = x * x;
Console.WriteLine(result);
return result;
}
static int Cube(int x)
{
var result = x * x * x;
Console.WriteLine(result);
return result;
}static void Main(string[] args)
{
Transformer t = null;
t += Square;
t += Cube;
var result = t(3);
Console.ReadKey();
}
}
注意:
委托是不可变的。
我们在使用+=或者-=这类符号的时候,实际上是新创建了一个委托实例。
如果多播委托的返回类型不是void,那么调用者从最后一个被调用的方法来接收返回值。
前面的方法仍然会被调用,但是其返回值就被弃用了。
所有的委托类型都派生于System.MulticastDelegate,而它又派生于System. Delegate。
C#会把作用于委托的+,-,+=, -+操作编译成使用System. Delegate的Combine和Remove两个静态方法。
下一篇:C#委托(下)