我看到代表有两种形式:
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
我不确定这两者之间到底有什么区别。他们都是代表吗?我相信第一个将使用lambda,第二个将必须具有实际执行工作的方法。我可能也会感到困惑。
Answers:
首先,您的两个示例正在做两个完全独立的事情。第一个是声明通用委托变量并为其分配值,第二个只是定义一个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
等),然后创建自己的代表始终是一个选择。
Func<int, string>
,显示形式为Func<arg1, result>
。
您拥有的代码示例使事情有些混乱,所以让我尝试清除它。以下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!!!
从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。