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);
}
}
}