Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于case,C#匿名方法的语法比lambda表达式的语法简单。书籍:Professional C#5.0和.NET 4.5.1_C#_.net_Lambda_Anonymous Methods - Fatal编程技术网

关于case,C#匿名方法的语法比lambda表达式的语法简单。书籍:Professional C#5.0和.NET 4.5.1

关于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表达式的语法更简单 而不是匿名方法的语法 调用有参数,您不需要参数和语法 匿名方法的定义更简单,因为不需要提供 在这种情况下的参数“ 有人能解释/举例

最近,我读了克里斯蒂安·纳格尔(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表达式中是不可能的。”你所说的基本上是正确的,但实际上并没有回答问题。