1. 程式人生 > 其它 >Unity_C#委託與事件——委託的基本使用

Unity_C#委託與事件——委託的基本使用

技術標籤:c#

委託與事件

這篇部落格是專門為剛接觸c#不久的新手寫的,內容較為簡單,隨便看看就好。

在c#當中,委託無疑是常用且重要的,有些人可能學習時並不是特別認真,導致對委託瞭解的並不是特別透徹,而這邊文章我便會帶你們再次複習一遍!

  • 委託的作用
    總的來說,委託可以使一個方法被當成引數來進行傳遞並使用,可以理解為它就是指向一個記憶體地址,而這個地址就是你所傳遞的方法引數的記憶體地址,如果你並沒有傳入方法引數,那麼它就是一個null值。
  • 委託的宣告
public delegate void Delegate_One();

如上所示,我們聲明瞭一個無引數且無返回值的委託,void代表此委託沒有返回值,()裡沒有引數就代表委託無引數。

public delegate int Delegate_Two();

這裡我們聲明瞭一個需要int返回值的委託。

public delegate void Delegate_Three(int num);

這次右聲明瞭一個無返回值但需要一個int引數的委託。

public delegate int Delegate_Four(int num);

最後則是一個需要int返回值並且帶有一個int引數的委託。

由此可見委託的宣告非常簡單,相較與方法它只是多了一個delegate關鍵字,同時它並沒有方法體的實現。

  • 委託的例項
    public Delegate_One delegate_One;
public Delegate_Two delegate_Two; public Delegate_Three delegate_Three; public Delegate_Four delegate_Four;

在上述程式碼裡,我們將之前宣告的四個不同的委託全部例項化了出來,可以發現委託的例項也非常簡單,與物件的例項相同,都是 “訪問修飾符”+“委託物件”+“例項名稱”。

  • 委託的呼叫
    既然委託是可以使方法當成引數傳遞,所以我們首先寫一個方法
    public void DelegateTest_One(Delegate_One delegate_One)
    {
if (delegate_One != null) { delegate_One(); //delegate_One.Invoke(); } }

這裡我們的方法引數不再是什麼int,string,物件什麼的,而是Delegate_One這個委託,而方法主體我們首先判斷了一下委託引數是否為空,因為委託就是一個引用地址,所以它是可以為null值的,那樣我們就沒必要再執行。

而傳進來的委託其實就是一個方法,它也可以像方法一樣執行—“delegate_One()”;,也可以用—delegate_One.Invoke();執行,兩種方法都是一樣的效果。

同時Delegate_One這個委託它是一個無參無返回值的委託,所以只要是一個無參無返回值的方法,我們都可以把他當成Delegate_One的委託例項進行傳遞

所以我們再次寫一個無參無返回值的方法,讓他作為引數進行傳遞:

    public void Test_One()
    {
        Debug.Log("執行無參無返回值委託")}

而後我們在Start中進行測試,如果不是在Unity當中,可以在Main函式中進行測試:

    private void Start()
    {
        DelegateTest_One(Test_One);
    }

在這裡插入圖片描述
ok,沒有任何問題!

同時,我們也可以傳入我們之前已經例項好了的delegate_One,也一樣可以,如下所示:

    private void Start()
    {
        //DelegateTest_One(Test_One);
        DelegateTest_One(delegate_One);
    }

但實際執行之後我們會發現沒有任何效果,那是因為我們並沒有對delegate_One進行賦值,於是我們對他進行賦值:

    private void Start()
    {
        //DelegateTest_One(Test_One);
        delegate_One = Test_One;
        DelegateTest_One(delegate_One);
    }

執行之後就可以發現效果是一樣的!

這時候我們就走完了一個委託的全部流程,接下來我們把其他幾個委託也全部測試一遍,完整程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public delegate void Delegate_One();
    public delegate int Delegate_Two();
    public delegate void Delegate_Three(int num);
    public delegate int Delegate_Four(int num);
    public Delegate_One delegate_One;
    public Delegate_Two delegate_Two;
    public Delegate_Three delegate_Three;
    public Delegate_Four delegate_Four;
    private void Start()
    {
        //DelegateTest_One(Test_One);
        delegate_One = Test_One;
        DelegateTest_One(delegate_One);
        //DelegateTest_Two(Test_Two);
        delegate_Two = Test_Two;
        DelegateTest_Two(delegate_Two);
        //DelegateTest_Three(Test_Three);
        delegate_Three = Test_Three;
        DelegateTest_Three(delegate_Three);
        //DelegateTest_Four(Test_Four);
        delegate_Four = Test_Four;
        DelegateTest_Four(delegate_Four);
    }
    public void Test_One()
    {
        Debug.Log("執行無參無返回值委託");
    }
    public void DelegateTest_One(Delegate_One delegate_One)
    {
        if (delegate_One != null)
        {
            delegate_One();
            //delegate_One.Invoke();
        }
    }
    public int Test_Two()
    {
        Debug.Log("執行無引數但返回值為int的委託");
        return 0;
    }
    public void DelegateTest_Two(Delegate_Two delegate_Two)
    {
        if (delegate_Two != null)
        {
            delegate_Two();
            //delegate_Two.Invoke();
        }
    }
    public void Test_Three(int num)
    {
        Debug.Log("執行無返回值但帶有int引數的委託,引數為:"+num);
    }
    public void DelegateTest_Three(Delegate_Three delegate_Three)
    {
        if (delegate_Three != null)
        {
            delegate_Three(0);
            //delegate_Three.Invoke(0);
        }
    }
    public int Test_Four(int num)
    {
        Debug.Log("執行帶有int引數並且返回值為int的委託,引數為:" + num);
        return 0;
    }
    public void DelegateTest_Four(Delegate_Four delegate_Four)
    {
        if (delegate_Four != null)
        {
            delegate_Four(0);
            //delegate_Four.Invoke(0);
        }
    }
}