OneBigLoser
OneBigLoser
发布于 2024-07-21 / 30 阅读
0
0

匿名方法和Lambda表达式

基本概念

匿名函数(Anonymous Function)是一种没有名称的函数。它可以在任何需要委托(delegate)或表达式的地方使用。C# 中的匿名函数包括匿名方法Lambda 表达式

  • 匿名方法:使用 delegate 关键字定义。

  • Lambda 表达式:使用 => 语法定义,是匿名方法的简洁形式。

用途

匿名函数常用于以下情况:

  1. 事件处理:简化事件订阅代码。

  2. 回调函数:用于异步操作完成后的回调。

  3. LINQ 查询:在 LINQ 查询中作为内联函数使用。

在游戏开发中的用途

在游戏开发中,匿名函数也有广泛应用:

  1. 事件系统:用于处理游戏中的各种事件,如玩家输入、碰撞检测等。

  2. 回调机制:用于异步操作完成后的通知,如加载资源完成时的回调。

  3. 脚本和行为:允许在运行时动态地定义对象行为。

语法规则和声明

匿名方法

delegate(int x, int y)
{
    return x + y;
}

Lambda表达式

(x, y) => x + y

示例代码及解释

示例1:使用匿名方法

using System;

class Program
{
    delegate int Operation(int x, int y);

    static void Main()
    {
        Operation add = delegate(int x, int y)
        {
            return x + y;
        };

        Console.WriteLine("3 + 4 = " + add(3, 4));
    }
}

解释

  • Operation 是一个委托,定义了接受两个 int 参数并返回一个 int 的方法签名。

  • 使用 delegate 关键字定义了一个匿名方法,将其赋值给 add 委托。

  • 调用 add 委托并输出结果。

示例2:使用Lambda表达式

using System;

class Program
{
    delegate int Operation(int x, int y);

    static void Main()
    {
        Operation add = (x, y) => x + y;

        Console.WriteLine("3 + 4 = " + add(3, 4));
    }
}

解释

  • 使用Lambda表达式定义了一个匿名函数,将其赋值给 add 委托。

  • 调用 add 委托并输出结果。

优点和缺点

优点

  • 简洁:减少代码量,避免为小功能定义多个方法。

  • 灵活:可以在需要时动态定义行为。

  • 增强可读性:在特定上下文中定义行为,提高代码的可读性。

缺点

  • 调试困难:匿名函数没有名字,调试时可能不如命名函数直观。

  • 代码维护:过多使用匿名函数可能导致代码难以维护和理解。

示例代码:在游戏开发中的使用

示例1:事件处理

using System;

public class Game
{
    public event Action<string> OnPlayerMove;

    public void MovePlayer(string direction)
    {
        OnPlayerMove?.Invoke(direction);
    }
}

class Program
{
    static void Main()
    {
        Game game = new Game();

        game.OnPlayerMove += delegate (string direction)
        {
            Console.WriteLine("Player moved to: " + direction);
        };

        game.MovePlayer("North");
        game.MovePlayer("South");
    }
}

解释

  • Game 类中定义了一个 OnPlayerMove 事件。

  • Main 方法中,使用匿名方法订阅了 OnPlayerMove 事件。

  • 调用 MovePlayer 方法触发事件,匿名方法处理并输出玩家移动的方向。

示例2:AI行为

using System;

public class Enemy
{
    public Action OnAttack;

    public void Attack()
    {
        OnAttack?.Invoke();
    }
}

class Program
{
    static void Main()
    {
        Enemy enemy = new Enemy();

        enemy.OnAttack += () => Console.WriteLine("Enemy attacks!");

        enemy.Attack();
    }
}

解释

  • Enemy 类中定义了一个 OnAttack 行为。

  • Main 方法中,使用Lambda表达式订阅了 OnAttack 行为。

  • 调用 Attack 方法触发行为,Lambda表达式处理并输出攻击信息。

基础练习题

  1. 定义一个委托 Comparison,接受两个 int 参数并返回一个 bool。使用匿名方法和Lambda表达式分别实现判断两个数是否相等的功能。

  2. 创建一个按钮点击事件,使用匿名方法处理按钮点击并输出点击次数。

进阶练习题

  1. 创建一个简单的游戏事件系统,包括玩家移动、攻击和死亡事件,使用匿名方法和Lambda表达式处理这些事件。

  2. 使用Lambda表达式实现一个排序算法,动态定义排序条件并对一个整数数组进行排序。

  3. 基础题目和进阶题目

    基础题目

    1. 使用匿名方法创建一个 Func<int, int, int>,计算两个整数的和并输出结果。

    2. 使用 Lambda 表达式创建一个 Func<int, int, int>,计算两个整数的乘积并输出结果。

    3. 创建一个事件系统,使用匿名方法或 Lambda 表达式订阅和处理事件。

    进阶题目

    1. 创建一个 List<int>,使用 Lambda 表达式过滤出所有的偶数并输出。

    2. 实现一个异步操作,使用匿名方法或 Lambda 表达式作为回调,通知操作完成。

    3. 创建一个复杂的事件系统,支持多个事件类型,使用匿名方法或 Lambda 表达式处理不同的事件。


评论