C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

发布于:2025-02-10 ⋅ 阅读:(37) ⋅ 点赞:(0)

匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。

使用场景

  • 事件处理:在处理事件时,不需要为每个事件处理程序单独定义一个命名方法,可以直接使用匿名方法。
  • 回调函数:当某个方法需要一个委托作为参数,用于后续的回调操作时,可以使用匿名方法来提供具体的实现逻辑。

语法

匿名方法使用 delegate 关键字来定义,基本语法如下:

delegate (参数列表)
{
    方法体;
};

示例:

无参数的匿名方法
using System;

class Program
{
    static void Main()
    {
        // 定义一个无参数的委托类型
        Action myAction = delegate ()
        {
            Console.WriteLine("这是一个无参数的匿名方法");
        };

        // 调用委托
        myAction();
    }
}
带参数的匿名方法
using System;

class Program
{
    static void Main()
    {
        // 定义一个带参数的委托类型
        Func<int, int, int> add = delegate (int a, int b)
        {
            return a + b;
        };

        // 调用委托
        int result = add(3, 5);
        Console.WriteLine($"结果是: {result}");
    }
}
在事件处理中使用匿名方法
using System;
using System.Threading;

class EventExample
{
    public event EventHandler MyEvent;

    public void TriggerEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

class Program
{
    static void Main()
    {
        EventExample example = new EventExample();

        // 使用匿名方法处理事件
        example.MyEvent += delegate (object sender, EventArgs e)
        {
            Console.WriteLine("事件被触发了");
        };

        // 触发事件
        example.TriggerEvent();
    }
}

优缺点

优点
  • 代码简洁:避免了为每个简单的委托实现单独定义一个命名方法,减少了代码量,使代码更加紧凑。
  • 内联定义:可以在需要委托的地方直接定义逻辑,提高了代码的可读性和可维护性。
缺点
  • 复用性差:由于匿名方法没有名称,不能在其他地方复用,只能在定义的地方使用。
  • 调试不便:在调试时,由于没有明确的方法名称,可能会增加调试的难度。

与 Lambda 表达式的关系

在 C# 3.0 及以后的版本中,引入了 Lambda 表达式,它是一种更简洁的创建委托实例的方式,通常可以替代匿名方法。例如,上面的 add 委托使用 Lambda 表达式可以写成:

Func<int, int, int> add = (a, b) => a + b;

Lambda 表达式在语法上更加简洁,因此在实际开发中使用更为广泛。

参数列表规则

  • 无参数:如果 Lambda 表达式不需要参数,可以使用空的参数列表,例如:() => Console.WriteLine("无参数的Lambda表达式");
  • 单个参数:当只有一个参数时,可以省略参数列表的括号,例如:num => num * 2;
  • 多个参数:多个参数需要用逗号分隔,并放在括号内,例如:(a, b) => a + b;