一般我們定義委托都是有如下兩步:
public delegate void MyDelegate(string name);//定義委托
public MyDelegate myDelegate; //使用委托
但.Net也提供了定義好的委托,我們可以直接使用。
System.Action 無返回值
Action: public delegate void Action (); Action< T >: public delegate void Action< T > (T obj); Action< T1, T2 >: public delegate void Action< T1, T2 > (T1 arg1, T2 arg2);
* delegate void Action<T1,T2,T3,T4>T1 arg1, T2 arg2, T3 arg3, T4 arg4);
System.Func 有返回值
Func< TResult > public delegate TResult Func< TResult > (); Func< T,TResult > public delegate TResult Func< T, TResult > (T arg); Func< T1,T2,TResult > public delegate TResult Func< T1, T2, TResult > (T1 arg1, T2 arg2);
*delegate TResult Func<T1,T2,T3,T4,TResult>T1 arg1, T2 arg2, T3 arg3, T4 arg4);
例子1:Action
using UnityEngine;
using System.Collections;
using System;
public class ActionTest : MonoBehaviour {
void Start () {
Action action = XXX;
action();
}
void XXX()
{
Debug.Log("100");
}
}
例子2:Action<T>
using UnityEngine;
using System.Collections;
using System;
public class ActionTest : MonoBehaviour {
void Start () {
Action<string> action = XXX;
action("unity C#");
}
void XXX(string name)
{
Debug.Log(name);
}
}
例子3:Action<T1,T2>
using UnityEngine;
using System.Collections;
using System;
public class ActionTest : MonoBehaviour {
void Start () {
Action<string,int> action = XXX;
action("unity C#",100);
}
void XXX(string name,int score)
{
Debug.Log(string.Format("{0} {1}",name,score);
}
}
#region Action的用法
///Action<T>的用法
///這裡的T為代理函數的傳入類型,無返回值
Action<string[]> action = delegate(string[] x)
{
var result = from p in x
where p.Contains("s")
select p;
foreach (string s in result.ToList())
{
Console.WriteLine(s);
}
};
string[] str={ "charlies","nancy","alex","jimmy","selina"};
action(str);
Console.ReadKey();
#endregion
上面的例子是通過傳入的String類型的數組,找出其中包含有字符s的項,然後輸出到控制台。
例子4:Func<TResult >
using UnityEngine;
using System.Collections;
using System;
public class FuncTest : MonoBehaviour {
void Start () {
Func< int > func= XXX;
Debug.Log( func() );
}
int XXX()
{
return 10;
}
}
例子5: Func<T,TResult>
using UnityEngine;
using System;
public Class FuncTest:MonoBehaviour{
void Start(){
Func<string ,int> func= CallStringLength;
}
int CallStringLength(string str){
return str.Lenth;
}
}
Func<string> func=delegate(){
return "我是Func<TResult>委托返回的結果";
}
Predicate只能接受一個傳入參數,返回值為bool類型
#region Predicate
///bool Predicate<T>的用法
///輸入一個T類型的參數,返回值為bool類型
Predicate<string[]> predicate = delegate(string[] x)
{
var result = from p in x
where p.Contains("s")
select p;
if (result.ToList().Count > 0)
{
return true;
}
else
{
return false;
}
};
string[] _value = { "charlies", "nancy", "alex", "jimmy", "selina" };
if (predicate(_value))
{
Console.WriteLine("They contain.");
}
else
{
Console.WriteLine("They don't contain.");
}
Console.ReadKey();
#endregion
上面的代碼其實也是判斷String數組中有沒有包含s的項,有的話就在控制台打印出 They contain.沒有的話就打印出They don't contain
//定義
public void CallUI<T>(Action<T, object[]> callback, params object[] args) where T : CUIBase
//調用
CUIManager.Instance.CallUI<CUIMidMsg>(
(_ui, _arg) => _ui.ShowMsg((string)_arg[0]),
string.Format(szMsg, format));
部分參考自:風宇沖Unity3D教程學院
本文版權歸作者和博客園共有,來源網址:http://www.cnblogs.com/zhaoqingqing/. 歡迎各位轉載,但是未經作者本人同意,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。