Func <string,string>和委托之间有什么区别?


79

我看到代表有两种形式:

A. Func<string, string> convertMethod = lambda 

B. public delegate string convertMethod(string value);

我不确定这两者之间到底有什么区别。他们都是代表吗?我相信第一个将使用lambda,第二个将必须具有实际执行工作的方法。我可能也会感到困惑。


是否可能手动
nawfal

Answers:


72

首先,您的两个示例正在做两个完全独立的事情。第一个是声明通用委托变量并为其分配值,第二个只是定义一个delegate类型。您的示例更完整地是:

public static class Program
{
    // you can define your own delegate for a nice meaningful name, but the
    // generic delegates (Func, Action, Predicate) are all defined already
    public delegate string ConvertedMethod(string value);

    public static void Main()
    {
        // both work fine for taking methods, lambdas, etc.
        Func<string, string> convertedMethod = s => s + ", Hello!";
        ConvertedMethod convertedMethod2 = s => s + ", Hello!";
    }
}

但更重要的是,两者 Func<string,string>delegate string convertMethod(string)就能够保持同样的方法定义,无论是方法,匿名方法或lambda表达式。

至于您应该使用哪种,要视情况而定。如果您希望通过委托和返回定义更多的委托,那么通用委托就是完美的。如果你想委托有给出该委托应该做的更清晰(超越了简单的一些特殊的名字ActionPredicate等),然后创建自己的代表始终是一个选择。


1
甚至更清楚的例子是Func<int, string>,显示形式为Func<arg1, result>
silvalli

5
我认为值得注意的是Func和Action是委托。当您知道它的时候似乎很明显,但是在查看Func的签名之前,我很害怕这个事实。因此,当您说:“首先,您的两个示例正在做两项完全独立的事情。” 您还可以说:“ Func是代表”。
Falk

12

您拥有的代码示例使事情有些混乱,所以让我尝试清除它。以下2项是委托声明。这些很容易发现,因为它们将始终包含delegate关键字

public delegate TReturn Func<TArg, TReturn>(Targ value);
public delegate string convertMethod(string value);

这行代码为本地分配一个值,该值键入委托

Func<string, string> local = lambda;

上面的代码不仅限于使用lambda。该值也可以是兼容的方法组或另一个委托值。

要注意的另一项是,即使Func<string, string>convertMethod都是具有相同签名的委托,它们的值也不能彼此转换。例如以下是非法的

Func<string, string> local1 = ...;
convertMethod local2 = local1; // Error!!!

8

MSDN

在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法。C#2.0引入了匿名方法,在C#3.0及更高版本中,lambda表达式取代了匿名方法,成为编写内联代码的首选方法。

在一种情况下,匿名方法提供了lambda表达式中找不到的功能。匿名方法使您可以省略参数列表。这意味着可以将匿名方法转换为具有各种签名的委托。

您可能还对委托关键字vs lambda表达式的此SO答案感兴趣。

此外,MSDN上有一篇有关Lambda表达式好文章

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}

在前面的示例中,请注意,委托签名具有一个类型为int的隐式输入参数,并返回一个int。lambda表达式可以转换为该类型的委托,因为它也具有一个输入参数(x)和一个返回值,编译器可以将其隐式转换为int类型。(在以下各节中将更详细地讨论类型推断。)使用5的输入参数调用委托时,它将返回结果25。


您也可以从lambda中省略参数。()=> Console.Writeline(“ parameter less lambda”)
Deo Dr Deo 2013年

动作测试=()=> Console.Writeline(“ parameter less lambda”); test.Invoke();
Deo博士

5

一个初始化一个委托的实例(可以立即调用)。它是Func <string,string>类型的变量。

B指定委托的定义(其签名)。以后可用于定义convertMethod类型的变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.