关于case,C#匿名方法的语法比lambda表达式的语法简单。书籍:Professional C#5.0和.NET 4.5.1
最近,我读了克里斯蒂安·纳格尔(Christian Nagel)、杰伊·格林(Jay Glynn)、摩根·斯金纳(Morgan Skinner)的《专业C#5.0和.NET 4.5.1》一书。 我对书中的“万一,匿名方法的语法比lambda表达式的语法简单”感到困惑 第8章:代表、lambda和事件中的详细信息 LAMBDA表达式”注意LAMBDA表达式的语法更简单 而不是匿名方法的语法 调用有参数,您不需要参数和语法 匿名方法的定义更简单,因为不需要提供 在这种情况下的参数“ 有人能解释/举例说明为什么在这种情况下匿名方法不需要提供参数吗 有人能解释/举例说明为什么匿名方法不需要提供 这种情况下的参数 因为如果您不使用委托参数,您可以让编译器为您自动生成它们。 例如:关于case,C#匿名方法的语法比lambda表达式的语法简单。书籍:Professional C#5.0和.NET 4.5.1,c#,.net,lambda,anonymous-methods,C#,.net,Lambda,Anonymous Methods,最近,我读了克里斯蒂安·纳格尔(Christian Nagel)、杰伊·格林(Jay Glynn)、摩根·斯金纳(Morgan Skinner)的《专业C#5.0和.NET 4.5.1》一书。 我对书中的“万一,匿名方法的语法比lambda表达式的语法简单”感到困惑 第8章:代表、lambda和事件中的详细信息 LAMBDA表达式”注意LAMBDA表达式的语法更简单 而不是匿名方法的语法 调用有参数,您不需要参数和语法 匿名方法的定义更简单,因为不需要提供 在这种情况下的参数“ 有人能解释/举例
internal delegate void MyDelegate(string s);
public class Foo
{
public void F()
{
MyDelegate del = delegate { Console.WriteLine("hello!"); };
}
}
如果我没有指定任何参数(因为我没有在委托中显式使用它们),编译器会将其转换为以下内容:
public void F()
{
MyDelegate del = delegate(string param0)
{
Console.WriteLine("hello!");
};
}
或者如果你想要真正讨厌的东西:
[编译生成]
私有静态void b__0(字符串参数0)
{
控制台。WriteLine(“你好!”);
}
公共空间F()
{
if(Foo.CS$9_uucachedanonymousmethoddelegate1==null)
{
Foo.CS$9_ucachedanonymousmethoddelegate1=新的MyDelegate(Foo.b_u0);
}
MyDelegate del=Foo.CS$9_ucachedanonymousmethoddelegate1;
}
因为这是有效的
Func<int,int> f = delegate { return 47; }
Func f=delegate{return 47;}
但事实并非如此
Func<int,int> f = () => 47;
Func f=()=>47;
使用匿名方法语法,如果不需要,可以省略参数。但在lambda表达式中,必须提供参数
这一点也已在以下文件中说明:
有一种情况下,匿名方法提供lambda表达式中找不到的功能。匿名方法允许您省略参数列表。这意味着匿名方法可以转换为具有各种签名的委托
如果您的方法需要一个参数,则需要定义/使用它,无论是lambda表达式还是匿名方法。
假设您有一个如下声明的委托
public delegate void PrintDelegate(string message);
PrintDelegate p1 = Console.WriteLine;
您可以将lambda表达式或匿名方法分配给它,如下所示
Lambda表达式
PrintDelegate p1 = message => { Console.WriteLine(message); };
PrintDelegate p2 = delegate(string text) { Console.WriteLine(text); };
匿名表达
PrintDelegate p1 = message => { Console.WriteLine(message); };
PrintDelegate p2 = delegate(string text) { Console.WriteLine(text); };
在这两种情况下,您可以看到已定义了参数。
但是,如果您想将委托挂接到具有相同签名的另一个方法,您可以执行以下操作
public delegate void PrintDelegate(string message);
PrintDelegate p1 = Console.WriteLine;
Console.WriteLine
与定义的委托具有相同的签名,因此在定义委托时无需显式指定参数
所有这些变体都可以正常调用,并将提供相同的输出
p1("Hello World");
请注意,如果在定义匿名方法时未使用参数,则不能在匿名方法中使用参数的传递值,这不是声明委托主体的理想方式。常用的约定是用下划线替换未使用的lambda参数,在这种情况下,您的第二个示例将变成Func f=\u=>47代码>,它有效、直观且可读(只要每个人都理解并接受下划线约定)。“有一种情况下,匿名方法提供lambda表达式中找不到的功能。匿名方法允许您省略参数列表。这意味着匿名方法可以转换为具有各种签名的委托。这在lambda表达式中是不可能的。”你所说的基本上是正确的,但实际上并没有回答问题。