摘要
委托(Delegate)是 C# 中一种非常重要的类型,它可以用来处理方法的传递和调用。在 C# 中,委托类型可以被定义为类、结构或值类型,它们可以用于定义事件处理程序、回调函数等等。在 C# 中,委托还支持动态添加和移除方法、委托返回值和匿名委托等功能,下面我们将详细介绍这些概念。
正文
委托的动态添加与移除
通过+=增加方法,-=移除方法
image.png
delegate int MyDel(int x,int y);
int Add(int x,int y)
{
return x + y;
}
int Minus(int x,int y)
{
return x - y;
}
private void btnShow_Click(object sender, EventArgs e)
{
MyDel del1 = new MyDel(Add);
del1 += new MyDel(Minus);
del1 -= new MyDel(Minus);
int x = del1(2, 3);
MessageBox.Show(x.ToString());
}
调用带返回值的委托
如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况。
- 调用列表中最后一个方法返回的值就是委托调用返回的值。
- 调用列表中所有其他方法的返回值都会被忽略。
delegate int MyDel(int x);
int sum = 5;
int Add(int x)
{
sum += x;
return sum;
}
int Minus(int x)
{
sum -= x;
return sum;
}
private void btnShow_Click(object sender, EventArgs e)
{
MyDel del1 = new MyDel(Add);
del1 += new MyDel(Minus);
del1(2);
MessageBox.Show(sum.ToString());
}
image.png
匿名方法
如果方法只会使用一次,我们用匿名方法就方便多了
image.png
delegate int MyDel(int x);
private void btnShow_Click(object sender, EventArgs e)
{
MyDel del = delegate (int x)
{
return x + 20;
};
MessageBox.Show(del(10).ToString());
}
Lambda表达式
删除delegate关键字;
在参数列表和匿名方法主体之间放Lambdai运算符=>。Lambdai运算符读作“goes to”。
private void btnShow_Click(object sender, EventArgs e)
{
MyDel del1 = (x) =>
{
return x + 10;
};
MessageBox.Show(del1(10).ToString());
}
image.png