C#裡Delegates的用法

Delegates在C#裡叫作委派
類似參數,但他傳遞的不是參數,而是功能方法

如 :
public class DelegateScript : MonoBehaviour 
{
delegate void MyDelegate(int num);  //使用
delegate 需要用delegate 作為開頭,並告知他要傳遞哪種類型的參數。
MyDelegate myDelegate;              //之後宣告一個
delegate

void PrintNum(int num)              //方法1 : 列印參數
{
print (
"Print Num: " + num);
}

void DoubleNum(int num)
            //方法2 : 列印參數X2
{
print (
"Double Num: " + num * 2);
}
 
void Start ()
{
myDelegate = PrintNum;          //當委派
myDelegate 為方法1時,他就是方法1
myDelegate(
50);                 //輸入與方法1相同的參數就會輸出方法1的結果(50)

myDelegate = DoubleNum;        
//當委派myDelegate 為方法2時,他就是方法2
myDelegate(
50);
                //輸入與方法2相同的參數就會輸出方法2的結果(100)
}
 }


委派具有其安全性,可以達成類似封裝的效果。


同時委派還具有可累加的功能特性。
 
public class MulticastScript : MonoBehaviour 
{
delegate void MultiDelegate();  
//使用delegate 需要用delegate 作為開頭,並告知他要傳遞哪種類型的參數。
MultiDelegate myMultiDelegate;  
//之後宣告一個delegate


void Start ()
{
myMultiDelegate += PowerUp;
//delegate 加入第一個方法 PowerUp
myMultiDelegate += TurnRed;
//delegate 加入第二個方法 TurnRed

if(myMultiDelegate != null) //防呆機制,當
delegate 不是空方法時
{
myMultiDelegate();      //執行
delegate ,在這個例子,他會同時執行 PowerUp() +TurnRed() 
}
}

void PowerUp()
{
print (
"Orb is powering up!");
}

void TurnRed()
{
renderer.material.color = Color.red;
}
}

在這邊要是要移掉目前的任一個 delegate 方法
只需要 
myMultiDelegate -= PowerUp 或 myMultiDelegate += TurnRed; 
即可
但要小心當 myMultiDelegate 為空時,再減掉方法則會報錯。

留言

熱門文章