【问题标题】:What does the operator '=>' mean in C#?运算符'=>'在C#中是什么意思?
【发布时间】:2009-02-22 03:43:18
【问题描述】:

此语句中的“=>”是什么意思?

del = new SomeDelegate(() => SomeAction());

上面的声明和这个一样吗?

del = new SomeDelegate(this.SomeAction);

谢谢。

【问题讨论】:

  • 您应该为您的问题使用更具描述性的标题,例如“'=>' 运算符在 C# 中的含义是什么?”而不是“c#委托问题”
  • 谢谢,我会尽量描述得更详细些。

标签: c# delegates lambda


【解决方案1】:

基本上它指定了一个匿名函数,它不接受调用 SomeAction 的参数。所以是的,它们在功能上是等效的。虽不相等。使用 lambda 更等同于:

del = new SomeDelegate(this.CallSomeAction);

其中 CallSomeAction 定义为:

public void CallSomeAction()
{
    this.SomeAction();
}

希望有帮助!

【讨论】:

  • 那么 '=>' 表示 lambda?一个比另一个有什么优势?
  • 优点主要是简洁和可读性之一:)
【解决方案2】:

“=>”可以读作“转到”(source: Eric Lippert),并且只是将参数与 lambda 表达式中的操作分开。在这种情况下,lambda 是多余的。更好的例子是:

var subList = list.FindAll(item => item.Type == "Foo");

(查找项目类型为 Foo 的所有项目)

等等。在 C# 2.0 中,也可以这样写:

var subList = list.FindAll(delegate(SomeType item) {
   return item.Type == "Foo";});

这是一种“内联”函数的快速表达方式,同时还提供“闭包”支持——即它也可以是:

string itemType = ...
var subList = list.FindAll(item => item.Type == itemType);

要这样做,否则需要一个类型定义来传递项目类型:

class Searcher {
    public string itemType;
    public bool Find(SomeType item) {return item.Type == itemType;}
}
...
Searcher searcher = new Searcher();
searcher.itemType = ...
var subList = list.FindAll(searcher.Find);

事实上,这几乎正是编译器为我们所做的事情(对于“委托”和 lambda 的使用)。最大的区别是 lambda也可以表达Expression,例如对于 LINQ。

【讨论】:

    【解决方案3】:

    它们相同的事情,但“() => ...”语法是所谓的 lambda 表达式,因此与匿名函数相同。您可以完全省略委托部分,让编译器为您推断委托类型。

    del = this.SomeAction;
    

    取决于“del”被声明为什么类型。

    编辑

    使用 lambdas 或匿名方法或仅使用常规方法作为初学者,您可以将没有委托签名的方法映射到委托。

    例如,假设您有一个签名为 bool myDelegate(int, int) 的委托,但您希望有一个签名为 bool myMethod(string, string) 的方法处理该委托。然后,您可以使用 lambda 表达式让您通过类似这样的简短语法内联执行此操作。

    delegate bool myDelegate(int x, int y);
    
    // With lambdas... 
    myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString());
    
    // With anonymous methods...
    myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); };
    
    // The good ol' way without lambdas or anonymous methods...
    myDelegate del3 = SomeDelegateHandler;
    
    ... then write a method somewhere else ...
    
    // Handler method
    private bool SomeDelegateHandler(int a, int b)
    {
      return myMethod(a.ToString(), b.ToString());
    }
    

    因此,正如您所见,lambda 和匿名方法基本上只是一种较短/内联的方式来制作处理委托的方法。在您的情况下,您可能不需要额外的方法。这仅取决于委托签名是否与您的方法签名相同,在我看来,它似乎是。

    【讨论】:

      【解决方案4】:

      =>Lambda Operator,lambda 表达式就像是 C# 2.0 anonymous methods 的演变。

      您可以以非常相似的方式使用匿名方法和 lambda 表达式来创建委托实例:

      Func<string,int> wordCount;
      wordCount = delegate (string text) { return text.Split().Length; };
      Console.WriteLine (wordCount("Hello World"));
      

      使用 lambda 表达式:

      Func<string,int> wordCount;
      wordCount = (string text) => { text.Split().Length; };
      Console.WriteLine (wordCount("Hello World"));
      

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2011-01-01
        • 1970-01-01
        • 2010-09-15
        • 2011-12-11
        • 2013-06-03
        • 2012-03-03
        • 2013-05-07
        相关资源
        最近更新 更多