C# 和Unity中的委托和事件机制

C# 中的委托和事件机制

在C#中,委托和事件是非常重要的概念,用于实现程序中的回调和事件处理。在这里,我们将介绍C#中委托和事件机制的基础知识和用法。

委托是一种类似于C/C++函数指针的概念,它允许将方法作为参数传递到其他方法中,以实现回调函数的功能。委托是一种类型,它可以表示一个或多个方法的引用,并且可以像普通函数一样被调用。

下面是一个简单的示例代码,展示了如何使用委托:

public delegate void MyDelegate(string message);

public class MyClass
{
    public void MyMethod(string message)
    {
        Console.WriteLine(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass();
        MyDelegate del = new MyDelegate(obj.MyMethod);

        del("Hello World!");
    }
}

在这个示例代码中,我们定义了一个委托类型 MyDelegate ,并在 MyClass 类中定义了一个方法 MyMethod ,该方法与委托类型 MyDelegate 兼容。在 Program 类中,我们创建了一个 MyClass 对象,并将 MyMethod 方法的引用传递给委托变量 del 。最后,我们通过调用委托变量 del 来调用 MyMethod 方法。

事件是一种特殊的委托,用于向其他对象通知某个发生的事件。事件包含两个主要部分:事件定义和事件处理程序。事件定义是一种特殊的委托类型,用于定义事件的签名。事件处理程序是一个方法,它与事件定义兼容,并在事件发生时被调用。

下面是一个简单的示例代码,展示了如何使用事件:

public class MyEventArgs : EventArgs
{
    public string Message { get; set; }
}

public class MyClass
{
    public event EventHandler<MyEventArgs> MyEvent;

    public void DoSomething()
    {
        MyEventArgs args = new MyEventArgs();
        args.Message = "Hello World!";

        if (MyEvent != null)
        {
            MyEvent(this, args);
        }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass();
        obj.MyEvent += MyEventHandler;
        obj.DoSomething();
    }

    static void MyEventHandler(object sender, MyEventArgs e)
    {
        Console.WriteLine(e.Message);
    }
}

在这个示例代码中,我们定义了一个事件 MyEvent ,并在 MyClass 类中定义了一个方法 DoSomething ,该方法在事件发生时被调用。在 Program 类中,我们创建了一个 MyClass 对象,并将事件处理程序 MyEventHandler 的引用添加到事件中。最后,我们通过调用 DoSomething 方法来触发事件,并在事件处理程序中输出事件的消息。

Unity中的委托和事件机制

在 Unity 中,委托和事件机制同样也是非常常见的编程概念,它们可以用于处理不同的场景,例如处理用户输入、处理游戏状态、处理游戏物体之间的交互等等。

委托是一个代表了一个或多个方法的引用的类型,可以理解为是一个函数指针,用于将方法作为参数传递、返回方法等。Unity 中常用的委托有 Action 和 Func,其中 Action 表示一个无返回值的委托,而 Func 则表示一个具有返回值的委托。

事件是委托的一种特殊形式,它只能用于添加和移除方法的操作。事件由委托类型定义,并且可以使用 C# 的 event 关键字来声明。事件可以用于在特定的场景中触发方法的执行,例如在游戏中当一个特定的条件满足时触发相应的方法。

以下是一个简单的 Unity 中委托和事件机制的示例:

using UnityEngine;
using System;

public class DelegateAndEventExample : MonoBehaviour
{
    // 定义一个代表了一个无参、无返回值方法的委托类型
    public delegate void MyDelegate();

    // 声明一个事件
    public event MyDelegate myEvent;

    // 声明一个方法,用于触发事件
    void TriggerEvent()
    {
        if (myEvent != null)
        {
            myEvent();
        }
    }

    void Start()
    {
        // 给事件添加一个方法
        myEvent += MyEventHandler;

        // 触发事件
        TriggerEvent();
    }

    void MyEventHandler()
    {
        Debug.Log("Event handled.");
    }
}

在上面的示例中,首先定义了一个委托类型 MyDelegate,它代表了一个无参、无返回值的方法。接着声明了一个事件 myEvent,它的类型是 MyDelegate。然后定义了一个方法 TriggerEvent,它用于触发事件。在 Start 方法中,将 MyEventHandler 方法添加到 myEvent 中,并且通过 TriggerEvent 方法触发了事件。当事件触发时,MyEventHandler 方法会被执行。

C#委托发布与订阅

C#委托的发布与订阅是一种常见的事件处理模式,也称为观察者模式。该模式定义了一种对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。

在C#中,委托可以用来实现事件的发布与订阅。在事件的发布者中定义一个委托类型的事件,订阅者可以通过该事件来注册自己的委托函数,从而在事件触发时得到通知并执行自己的处理逻辑。具体实现过程如下:

  1. 声明一个委托类型,定义事件所需的委托签名。例如:
    public delegate void EventHandler(object sender, EventArgs e);
    

  2. 在发布者类中定义事件,使用上述委托类型作为事件类型。例如:
    public class Publisher
    {
        public event EventHandler EventName;
    }
    

  3. 在发布者类中定义触发事件的方法,通过调用委托实例来触发事件。例如:
    public void TriggerEvent()
    {
        if (EventName != null)
        {
            EventName(this, EventArgs.Empty);
        }
    }
    

  4. 在订阅者类中定义一个委托函数,该函数的签名与事件委托类型一致,用于处理事件。例如:
    public void HandleEvent(object sender, EventArgs e)
    {
        // 处理事件
    }
    

  5. 在订阅者类中通过事件订阅符号“+=”来注册委托函数到事件中。例如:
    Publisher publisher = new Publisher();
    publisher.EventName += HandleEvent;
    

  6. 在需要触发事件的时候,在发布者对象上调用触发事件的方法,订阅者的委托函数会自动执行。例如:
    publisher.TriggerEvent();
    

    这样,当事件触发时,所有注册到事件中的委托函数都会被调用执行,从而完成事件的处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值