C# 委托进阶

摘要


委托(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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容