C#内置泛型委托:Func委托

本文深入解析了Func委托的概念,包括其定义、使用场景及如何通过不同方式创建和使用Func委托,如匿名方法、lambda表达式等。并通过实例展示了Func委托在不同参数和返回值类型下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是Func委托

Func委托代表有返回类型的委托

2、Func委托定义

查看Func的定义:

using System.Runtime.CompilerServices;

namespace System
{
    //
    // 摘要:
    //     封装一个方法,该方法具有两个参数,并返回由 TResult 参数指定的类型的值。
    //
    // 参数:
    //   arg1:
    //     此委托封装的方法的第一个参数。
    //
    //   arg2:
    //     此委托封装的方法的第二个参数。
    //
    // 类型参数:
    //   T1:
    //     此委托封装的方法的第一个参数的类型。
    //
    //   T2:
    //     此委托封装的方法的第二个参数的类型。
    //
    //   TResult:
    //     此委托封装的方法的返回值类型。
    //
    // 返回结果:
    //     此委托封装的方法的返回值。
    [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
    public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
}

你会发现,Func其实就是有多个输出参数并且有返回值的delegate。

3、示例

Func至少0个输入参数,至多16个输入参数,根据返回值泛型返回。必须有返回值,不可void。

Func<int> 表示没有输入参参,返回值为int类型的委托。

Func<object,string,int> 表示传入参数为object, string ,返回值为int类型的委托。

Func<object,string,int> 表示传入参数为object, string, 返回值为int类型的委托。

Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型),返回值为int类型的委托。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FunDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 无参数,只要返回值 
            Func<int> fun1 = new Func<int>(FunWithNoPara);
            int result1= fun1();
            Console.WriteLine(result1);
            Console.WriteLine("----------------------------");
            Func<int> fun2 = delegate { return 19; };
            int result2 = fun2();
            Console.WriteLine(result2);
            Console.WriteLine("----------------------------");
            Func<int> fun3 = () => { return 3; };
            int result3 = fun3();
            Console.WriteLine(result3);
            Console.WriteLine("----------------------------");
            //有一个参数,一个返回值
            Func<int, int> fun4 = new Func<int, int>(FunWithPara);
            int result4 = fun4(4);
            Console.WriteLine($"这里是一个参数一个返回值的方法,返回值是:{result4}");
            Console.WriteLine("----------------------------");
            // 使用委托
            Func<int, string> fun5 = delegate (int i) { return i.ToString(); };
            string result5 = fun5(5);
            Console.WriteLine($"这里是一个参数一个返回值的委托,返回值是:{result5}");
            Console.WriteLine("----------------------------");
            // 使用匿名委托
            Func<int, string> fun6 = (int i) => 
            {
                return i.ToString();
            };
            string result6 = fun6(6);
            Console.WriteLine($"这里是一个参数一个返回值的匿名委托,返回值是:{result6}");
            Console.WriteLine("----------------------------");
            // 多个输入参数
            Func<int, string, bool> fun7 = new Func<int, string, bool>(FunWithMultiPara);
            bool result7 = fun7(2, "2");
            Console.WriteLine($"这里是有多个输入参数的方法,返回值是:{result7}");
            Console.WriteLine("----------------------------");
            // 使用委托
            Func<int, string, bool> fun8 = delegate (int i, string s) 
            {
                return i.ToString().Equals(s) ? true : false;
            };
            bool result8 = fun8(2, "abc");
            Console.WriteLine($"这里是有多个输入参数的委托,返回值是:{result8}");
            Console.WriteLine("----------------------------");
            // 使用匿名委托
            Func<int, string, bool> fun9 = (int i, string s) => 
            {
                return i.ToString().Equals(s) ? true : false;
            };
            bool result9 = fun9(45, "ert");
            Console.WriteLine($"这里是有多个输入参数的匿名委托,返回值是:{result9}");
            Console.ReadKey();

        }

        static int FunWithNoPara()
        {
            return 10;
        }

        static int FunWithPara(int i)
        {
            return i;
        }

        static bool FunWithMultiPara(int i,string s)
        {
            return i.ToString().Equals(s) ? true : false;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

### C# 委托概述 委托允许创建可重用的方法签名模板,这些模板可以在定义时不指定具体的参数或返回类。这使得代码更加灵活和通用。 #### 定义与声明 通过`Func<T>` 和 `Action<T>` 可以快速定义具有不同输入输出特性的委托: - **无参有返回值** 的情况可以通过 `Func<TReturn>` 来表示。 ```csharp Func<int> show = () => { int num = 0; for (int i = 0; i < 10; i++) { Console.WriteLine(i); num += i; } return num; }; Console.WriteLine(show()); ``` - 对于 **单个入参无返回值** 场景,则适用 `Action<T>` 形式的委托[^1]。 ```csharp Action<int> go = (num) => { for (int i = 0; i < num; i++) { Console.WriteLine(num); } }; go(10); ``` 上述例子展示了如何利用匿名函数或者 lambda 表达式简化语法结构的同时保持功能不变。 #### 参数传递方式 当涉及到更复杂的操作时,比如需要交换两个整数的位置,可以借助带有引用修饰符 (`ref`) 的方法完成此任务: ```csharp Swap<int>(ref num1, ref num2); ``` 这里不仅体现了机制带来的灵活性,同时也说明了即使对于基本数据类也可以安全有效地实施互换逻辑[^2]。 #### 高级应用实例 为了进一步展示委托的强大之处,考虑这样一个需求——在一个列表里找到符合条件的第一个元素并获取其值。此时就可以运用内置的 `Find<T>()` 方法配合 Lambda 表达式轻松达成目标: ```csharp List<int> intList = new List<int>{1, 3, 7, 9}; int result = intList.Find(x => x > 5); Console.WriteLine($"First element greater than 5 is: {result}"); ``` 这段代码片段清晰地表达了查询过程中的筛选条件以及最终的结果处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值