[C#] 委托之Action和Func区别

简介:



一、说明

一般我们定义委托都是有如下两步:

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/p/3778716.html,如需转载请自行联系原作者

相关文章
|
3月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
95 7
|
4月前
|
网络协议 网络性能优化 C#
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
91 1
|
3月前
|
开发框架 安全 .NET
C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别
通过上述详细的解释和实例分析,相信大家对 `Server.UrlEncode` 和 `HttpUtility.UrlDecode` 的区别有了更深刻的理解,并能在实际开发中灵活运用。
106 0
|
4月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
252 1
|
5月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
210 7
|
5月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
191 5
|
6月前
|
C# C++
C# 委托
C# 委托
57 0
|
6月前
|
C# 开发框架 .NET
C# 语法中级
本文介绍了C#语法中的多个中级主题,包括lambda表达式、匿名类型、匿名方法、异常处理、枚举器与迭代器以及可空类型。重点内容如下: - **Lambda表达式**:编译为私有方法,支持捕获外部变量和迭代变量。 - **匿名类型**:通过`var`关键字创建,可用于快速定义对象。 - **匿名方法**:无需命名的委托实现。 - **异常处理**:常见异常类型及`try..catch..finally`语句。 - **枚举器与迭代器** 这些特性增强了C#的灵活性和表达能力,适用于更复杂的编程场景。
70 0
|
3月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
66 3
|
2月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
122 12