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

委托(Delegate)的学习

基本概念

委托(Delegate)是 C# 中的一种类型,类似于 C 或 C++ 中的函数指针。委托用于封装一个方法的引用,并且可以动态地指定和调用方法。换句话说,委托可以存储对方法的引用,并在需要时调用这些方法。

用途

委托常用于以下场景:

  1. 事件处理:用于处理用户输入、定时器、网络请求等事件。

  2. 回调函数:用于在某些操作完成时通知调用方。

  3. 多态和灵活代码:允许动态改变方法的调用,提高代码的灵活性和可扩展性。

在游戏开发中的用途

在游戏开发中,委托也有广泛的应用:

  1. 事件系统:用于处理用户输入、游戏事件等。

  2. 回调机制:用于异步操作完成后的通知。

  3. 脚本和行为:允许在运行时动态地改变游戏对象的行为。

语法规则及声明

  1. 声明委托:使用 delegate 关键字声明委托类型。

  2. 实例化委托:用具体的方法实例化委托。

  3. 调用委托:通过委托实例调用方法。

声明委托

public delegate void MyDelegate(string message);

实例化委托

MyDelegate del = new MyDelegate(SomeMethod);

调用委托

del("Hello, Delegate!");

示例代码及解释

示例1:基本操作

using System;

public class Program
{
    // 声明委托类型
    public delegate void MyDelegate(string message);

    // 定义一个与委托类型匹配的方法
    public static void Greet(string message)
    {
        Console.WriteLine(message);
    }

    public static void Main()
    {
        // 实例化委托
        MyDelegate del = new MyDelegate(Greet);

        // 调用委托
        del("Hello, Delegate!");
    }
}

解释

  • 我们声明了一个 MyDelegate 委托,它封装一个接受 string 参数并返回 void 的方法。

  • 然后,我们定义了一个 Greet 方法,它与 MyDelegate 委托的签名匹配。

  • Main 方法中,我们实例化了 MyDelegate 委托,并将 Greet 方法分配给它。

  • 最后,我们通过委托实例 del 调用了 Greet 方法。

示例2:在游戏开发中的应用

using System;

public class Player
{
    // 声明一个委托类型用于事件处理
    public delegate void PlayerEventHandler(string message);

    // 定义一个事件
    public event PlayerEventHandler PlayerDied;

    // 模拟玩家死亡的方法
    public void Die()
    {
        Console.WriteLine("Player is about to die...");
        // 触发事件
        if (PlayerDied != null)
        {
            PlayerDied("Player has died.");
        }
    }
}

public class Game
{
    public static void OnPlayerDied(string message)
    {
        Console.WriteLine(message);
    }

    public static void Main()
    {
        Player player = new Player();

        // 订阅事件
        player.PlayerDied += OnPlayerDied;

        // 模拟玩家死亡
        player.Die();
    }
}

解释

  • 我们定义了一个 PlayerEventHandler 委托,用于封装事件处理方法。

  • Player 类中,我们声明了一个 PlayerDied 事件,该事件使用 PlayerEventHandler 委托。

  • Die 方法模拟玩家死亡,并触发 PlayerDied 事件。

  • Game 类中,我们定义了 OnPlayerDied 方法,用于处理玩家死亡事件。

  • Main 方法中,我们实例化了 Player 类,并订阅了 PlayerDied 事件。

  • 当玩家死亡时,OnPlayerDied 方法被调用,输出玩家死亡的信息。

优点和缺点

优点

  1. 灵活性:委托允许在运行时动态指定和调用方法,提高代码的灵活性。

  2. 解耦:委托可以减少代码之间的耦合,使代码更模块化。

  3. 可扩展性:通过委托可以轻松扩展和修改代码的行为。

缺点

  1. 复杂性:对于初学者来说,委托的概念和使用可能比较复杂。

  2. 性能开销:委托的调用会有一定的性能开销,特别是在高频调用时。

基础题目和进阶题目

基础题目

  1. 声明一个 delegate,它封装一个接受 int 参数并返回 int 的方法。定义一个方法计算一个整数的平方,并使用委托调用该方法。

  2. 声明一个 delegate,它封装一个没有参数且返回 void 的方法。定义一个方法输出 "Hello, World!",并使用委托调用该方法。

  3. 声明一个 delegate,它封装一个接受两个 int 参数并返回 int 的方法。定义一个方法计算两个整数的和,并使用委托调用该方法。

进阶题目

  1. 创建一个事件系统,定义一个 delegate 和事件,用于通知游戏中的特定事件(如敌人被击败)。定义一个处理该事件的方法,并订阅和触发事件。

  2. 使用委托实现一个简单的回调机制。在异步操作完成后,调用回调方法通知调用方操作结果。

  3. 使用多播委托(Multicast Delegate),定义一个委托类型并订阅多个方法。调用委托时,所有订阅的方法都将被调用。


评论