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

时间:2011-07-25 15:41:18

标签: c# asp.net delegates lambda

我看到代表有两种形式:

A. Func<string, string> convertMethod = lambda 

B. public delegate string convertMethod(string value);

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

4 个答案:

答案 0 :(得分:59)

首先,你的两个例子是做两件完全不同的事情。第一个是声明一个通用委托变量并为其赋值,第二个是定义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 :(得分:12)

您拥有的代码示例让人感到困惑,所以让我尝试清理它。以下2项是代表声明。这些很容易识别,因为它们始终包含delegate关键字

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

这行代码将值分配给键入委托的本地

Func<string, string> local = lambda;

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

另外需要注意的一点是,尽管Func<string, string>convertMethod都是具有相同签名的代理,但其值可相互转换。例如,以下是非法的

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

答案 2 :(得分:8)

来自MSDN

  

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

  

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

您可能也对delegate keyword vs lambda expression上的此答案感兴趣。

此外,MSDN还有good article on Lambda Expressions

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。

答案 3 :(得分:4)

A 初始化委托的实例(可以立即调用)。它是Func&lt;类型的变量。 string,string&gt;。

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