[C#] 委托之Action和Func区别
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/3778716.html
一、说明#
一般我们定义委托都是有如下两步:
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教程学院
作者:赵青青 一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验