我看到代表有两种形式:
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
我不确定这两者之间究竟有什么区别。他们都是代表吗?我相信第一个会使用lambda,第二个必须有一个方法来实际执行工作。我也可能感到困惑。
答案 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表达式。
至于你应该使用哪种,取决于具体情况。如果您希望通过所需和返回来更多地定义您的委托,那么通用委托就是完美的。如果您希望委托具有一些特殊名称,该名称可以更好地定义委托应该执行的操作(超出简单Action
,Predicate
等),那么创建自己的委托始终是一个选项。
答案 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 类型的变量。