C#中委托可以理解为函数指针,它是一种类型安全的函数指针。它可以将一个或多个方法绑定到委托实例中,并使用该委托实例调用这些方法。委托类型的语法如下:
delegate <返回值类型> <委托名称>(<参数列表>);
例如,以下是一个委托类型定义:
delegate int MyDelegate(string str);
这个委托类型可以绑定到一个返回类型为int、参数类型为string的方法。
委托可以用来实现事件、回调函数、多播委托等功能。以下是一些常用的委托用法:
单播委托
单播委托只能绑定一个方法,以下是一个例子:
class Program
{
delegate void MyDelegate(int num);
static void Main(string[] args)
{
MyDelegate del = new MyDelegate(PrintNumber);
del(100);
}
static void PrintNumber(int num)
{
Console.WriteLine(num);
}
}
输出:
100
多播委托
多播委托可以绑定多个方法,多个方法的执行顺序可由添加方法的顺序决定,以下是一个例子:
class Program
{
delegate void MyDelegate(int num);
static void Main(string[] args)
{
MyDelegate del = new MyDelegate(PrintNumber1);
del += PrintNumber2;
del(100);
}
static void PrintNumber1(int num)
{
Console.WriteLine("PrintNumber1: " + num);
}
static void PrintNumber2(int num)
{
Console.WriteLine("PrintNumber2: " + num);
}
}
输出:
PrintNumber1: 100
PrintNumber2: 100
注意:多播委托如果绑定的方法有返回值,则只会返回最后一个方法的返回值。
匿名方法
匿名方法是指没有方法名的方法,它可以用来替代委托中的具名方法。以下是一个例子:
class Program
{
delegate void MyDelegate(int num);
static void Main(string[] args)
{
MyDelegate del = delegate(int num)
{
Console.WriteLine(num);
};
del(100);
}
}
输出:
100
Lambda表达式
Lambda表达式是一种简洁的写法,它可以用来替代匿名方法和具名方法。以下是一个例子:
class Program
{
delegate void MyDelegate(int num);
static void Main(string[] args)
{
MyDelegate del = (int num) => Console.WriteLine(num);
del(100);
}
}
输出:
100
Lambda表达式的语法很简单,它由参数列表、箭头符号和方法体组成。箭头符号左边是参数列表,右边是方法体,可以省略参数类型和括号。Lambda表达式可以用来表示任何委托类型,只需要满足参数列表和返回类型的要求即可。