基本概念
匿名函数(Anonymous Function)是一种没有名称的函数。它可以在任何需要委托(delegate)或表达式的地方使用。C# 中的匿名函数包括匿名方法和Lambda 表达式。
匿名方法:使用
delegate
关键字定义。Lambda 表达式:使用
=>
语法定义,是匿名方法的简洁形式。
用途
匿名函数常用于以下情况:
事件处理:简化事件订阅代码。
回调函数:用于异步操作完成后的回调。
LINQ 查询:在 LINQ 查询中作为内联函数使用。
在游戏开发中的用途
在游戏开发中,匿名函数也有广泛应用:
事件系统:用于处理游戏中的各种事件,如玩家输入、碰撞检测等。
回调机制:用于异步操作完成后的通知,如加载资源完成时的回调。
脚本和行为:允许在运行时动态地定义对象行为。
语法规则和声明
匿名方法
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表达式处理并输出攻击信息。
基础练习题
定义一个委托
Comparison
,接受两个int
参数并返回一个bool
。使用匿名方法和Lambda表达式分别实现判断两个数是否相等的功能。创建一个按钮点击事件,使用匿名方法处理按钮点击并输出点击次数。
进阶练习题
创建一个简单的游戏事件系统,包括玩家移动、攻击和死亡事件,使用匿名方法和Lambda表达式处理这些事件。
使用Lambda表达式实现一个排序算法,动态定义排序条件并对一个整数数组进行排序。
基础题目和进阶题目
基础题目
使用匿名方法创建一个
Func<int, int, int>
,计算两个整数的和并输出结果。使用 Lambda 表达式创建一个
Func<int, int, int>
,计算两个整数的乘积并输出结果。创建一个事件系统,使用匿名方法或 Lambda 表达式订阅和处理事件。
进阶题目
创建一个
List<int>
,使用 Lambda 表达式过滤出所有的偶数并输出。实现一个异步操作,使用匿名方法或 Lambda 表达式作为回调,通知操作完成。
创建一个复杂的事件系统,支持多个事件类型,使用匿名方法或 Lambda 表达式处理不同的事件。