Func <string,string>和delegate有什么区别?

我以两种forms看到代表:

A. Func<string, string> convertMethod = lambda B. public delegate string convertMethod(string value); 

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

首先,你们的两个例子正在做两件完全分开的事情。 首先是声明一个通用的委托variables,并给它赋值,第二个只是定义一个delegatetypes。 你的例子更完整的是:

 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!"; } } 

但更重要的是,无论是方法,匿名方法还是lambdaexpression式, Func<string,string>delegate string convertMethod(string)都能够保持相同的方法定义。

至于你应该使用,取决于情况。 如果你希望你的委托被更多的定义和返回,那么通用委托是完美的。 如果你想要委托有一些特殊的名字,给出更多的委托应该做什么(除了简单的ActionPredicate等)的定义,然后创build自己的委托总是一个选项。

从MSDN ,

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

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

你也可能对这个SO关于委托关键字vs lambdaexpression式的答案感兴趣。

另外,MSDN 在Lambdaexpression式上有一篇很好的文章 :

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

在前面的示例中,请注意,委托签名具有一个types为int的隐式typesinput参数,并返回一个int。 lambdaexpression式可以转换为该types的委托,因为它也有一个input参数(x)和一个编译器可以隐式转换为inttypes的返回值。 (types推断将在下面的章节中详细讨论。)当通过使用input参数5调用委托时,返回结果25。

你有的代码示例混淆了一些东西,所以让我尝试清除它。 以下两项是委托声明。 这些很容易被发现,因为它们总是包含delegate关键字

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

这行代码是分配一个值到本地,这是一个委托input

 Func<string, string> local = lambda; 

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

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

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

初始化一个委托的实例(可以立即调用)。 这是一个types为Func <string,string>的variables。

B指定委托的定义(其签名)。 它可以用于稍后定义convertMethodtypes的variables。