學習內容及其引用 [ ] 委托的定義以及如何理解委托 [ ] 委托的聲明及其由來 [ ] 委托類型的實例 [ ] 多播委托 [ ] 委托的缺點 [ ] Action委托與Func委托 委托•語法篇 C#語言入門詳解 Delegate詳解 委托的定義以及如何理解委托 委托現實的定義: 本人不需要親自去 ...
學習內容及其引用
委托的定義以及如何理解委托
- 委托現實的定義:
- 本人不需要親自去執行,全權委托第三方,替它來執行具體事物的概念。
- 也就是讓別人間接完成本該由我來完成的事情。
- 委托程式的定義:
- 首先是一個類(Class),引用類型的數據類型
- 可以指向 一個或多個方法的引用。(類型相容)
- 個人理解:
- 調用別人的方法(本身是第三方),也就是間接的使用;並且該方法可以為一個或者多個。
- 補充:
-
- C#有五類數據類型,整個數據類型分為2種:值類型(結構體,枚舉)和引用數據類型(類,介面,委托)
- 事件和LAMBDA表達式的基礎都是委托;而LAMBDA表達式又是LINQ的基礎。
委托的聲明及其由來
委托雖然是一種類(Class),引用類型的數據類型;但是它和我們一般方法的聲明格式很接近。
//聲明委托類型
public delegate void /*返回值類*/ MyDelegate(/*參數列表*/);
//這個委托類型可以指向任何一個:返值為空,參數列表為空的其他方法。
/*目標方法:委托所指向的方法*/
//C#允許嵌套類型,可以在類中進行委托的聲明。
委托的聲明格式是仿照C/C++[函數指針]的聲明格式。
#include <stdio.h>
//聲明一個函數指針
typedef int(* Calculator)(int _x,int _y);
int add(int _a,int _b){
return _a + _b;
}
int Multiply(int _a,int _b){
return _a * _b;
}
int main(void) {
int x = 9;
int y = 9;
Calculator pointer01 = &add;
Calculator pointer02 = &Multiply;
printf("Add Result (pointer01) : %d\n",pointer01(x,y));
printf("Multiply Result (pointer02) : %d\n",pointer02(x,y));
return 0;
}
//輸出:
//Add Result (pointer01) : 18
//Multiply Result (pointer02) : 81
delegate關鍵字也就對應了C語言種的*號(也就是指針定義符),其餘都是一一對應的。
委托類型的實例
用委托實現按空格時,物體隨機移動。
using UnityEngine;
public class DelegateTest : MonoBehaviour
{
private SpriteRenderer image;
private delegate void MyDelegate();//聲明委托
private MyDelegate myDelegate;
private void Start()
{
image = GetComponent<SpriteRenderer>();
}
//Awake之後Start之前調用
private void OnEnable()
{
myDelegate = new MyDelegate(Teleport);
//myDelegate = Teleport;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
myDelegate.Invoke();
//myDelegate();
}
}
//隨機位置移動
private void Teleport()
{
Vector2 currentPos = transform.position;
currentPos.x = UnityEngine.Random.Range(-5F, 5F);
transform.position = currentPos;
}
//隨機顏色
private void ChangeColor()
{
image.color = new Color(UnityEngine.Random.value,UnityEngine.Random.value,UnityEngine.Random.value);
}
//輸出時間
private void Log()
{
Debug.Log("Current Time is : " + System.DateTime.UtcNow);
}
}
多播委托
我們都知道,電腦中的“=”是賦值,這個就是單播委托,如果想要多個方法一起調用,需要用到“+=”,也就是多播委托。
我們可以在上述的基礎上,加上變色和輸出,效果如下。
.
...
//Awake之後Start之前調用
private void OnEnable()
{
myDelegate = new MyDelegate(Teleport);
myDelegate += new MyDelegate(ChangeColor);
myDelegate += new MyDelegate(Log);
}
...
委托的缺點
委托會引用一個方法,如果這個方法是實例方法(隸屬於一個對象)。這個對象會存在記憶體當中,從而造成記憶體泄漏
從而也就讓事件和觀察者模式的出現。
Action委托與Func委托
C#類庫中給我準備好了兩個委托:Action和Func;他們最多可以有16個參數。
- Action委托
- 無返回值,可以有參數列表。
- Func委托
- 有返回值,可以有參數列表。