繁体   English   中英

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

[英]About in case,C# the syntax of anonymous methods simpler than syntax of lambda expressions. Book:Professional C# 5.0 and .NET 4.5.1

最近,我读了“Christian Cage的专业C#5.0和.NET 4.5.1; Jay Glynn; Morgan Skinner”一书。 我对此感到困惑:“以防万一,匿名方法的语法比lambda表达式的语法更简单”。

第8章中的详细信息:Delegates,Lambdas和Events

LAMBDA EXPRESSIONS“注意lambda表达式的语法比匿名方法的语法简单。在要调用的方法有参数但不需要参数的情况下,匿名方法的语法更简单,因为你不能在这种情况下需要提供参数 。“

任何人都可以解释/示例为什么匿名方法在这种情况下不需要提供参数?

因为这是有效的

Func<int,int> f = delegate { return 47; }

但事实并非如此

Func<int,int> f = () =>  47;

使用匿名方法语法,如果不需要,可以省略参数。 但是在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!");
    };
}

或者如果你想要真正讨厌的东西:

[CompilerGenerated]
private static void <F>b__0(string param0)
{
    Console.WriteLine("hello!");
}

public void F()
{
    if (Foo.CS$<>9__CachedAnonymousMethodDelegate1 == null)
    {
        Foo.CS$<>9__CachedAnonymousMethodDelegate1 = new MyDelegate(Foo.<F>b__0);
    }
    MyDelegate del = Foo.CS$<>9__CachedAnonymousMethodDelegate1;
}

如果你的方法需要一个参数,你需要定义/使用它,无论是lambda表达式还是匿名方法。
假设您有一个如下所述的委托。

public delegate void PrintDelegate(string message);

您可以像下面一样为其分配lambda表达式或匿名方法

Lambda表达

PrintDelegate p1 = message => { Console.WriteLine(message); };

匿名表达

PrintDelegate p2 = delegate(string text) { Console.WriteLine(text); };

在这两个中,您都会看到已定义参数。
但是,如果要将委托挂钩到具有相同签名的另一个方法,则可以执行以下操作。

PrintDelegate p1 = Console.WriteLine;

Console.WriteLine与定义的委托具有相同的签名,因此在定义委托时无需显式指定参数。

所有这些变化都可以正常调用,并提供相同的输出。

p1("Hello World");

注意其他答案,其中参数未用于定义匿名方法,您不能使用匿名方法中参数的传递值,这不是声明委托主体的理想方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM