【问题标题】:C# => operator?C# => 运算符?
【发布时间】:2011-04-25 17:47:49
【问题描述】:

我对 C# 中的 => 运算符有疑问。

我正在查看 Expression Blend 4 示例。 Contact 示例中有一行,其中包括:

//In C:\Program Files (x86)\Microsoft Expression\Blend 4\Samples\en\Contacts\
//Contacts\ViewModels\ContactsViewModel.cs: 

contactDetailWindow.Closed += (o, e) =>
{                              
   finishedCallback(contactDetailWindow.DialogResult);

   // Or, C:\Program Files (x86)\Microsoft Expression\Blend 4\Samples\en\
   // Contacts\Contacts\ViewModels\ContactsViewModel.cs
   this.EditContact(newContact, dialogResult =>
   {
        if (dialogResult.HasValue && dialogResult.Value)
        {
        this.Contacts.Add(newContact);
        }
   });
};

=> 运算符实际上在做什么?它是否覆盖了某些东西?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    它被称为lambda operator

     b.Click += (s, e) => Log("Sender :" + s + "EventArgs " + e);
    

    等同于

    b.Click += b_Click;
    
    void b_Click(object sender, EventArgs e)
    {
        Log("Sender :" + sender + "EventArgs " + e);
    }
    

    b.Click += delegate(object sender, EventArgs e) 
               { 
                   Log("Sender :" + sender + "EventArgs " + e);  
               };
    

    【讨论】:

    • 将此 => lambda 运算符与 ? 一起使用。运算符作为函数参数,或以其他方式传递此结构,会使整个程序不可读且难以维护。请考虑一下。
    【解决方案2】:

    => 是一个 lambda 表达式运算符,您可以将其视为 javascript 中的匿名函数

    在这种情况下

    ContactDetailWindow.Closed += (o, e) => { finishedCallback(contactDetailWindow.DialogResult);
    

    它正在创建一个函数,用作关闭事件的处理程序。编译器可以推断出 o 和 E 的类型,因为它知道封闭委托的定义。

    【讨论】:

      【解决方案3】:

      这是一个 lambda 表达式。下面定义了一个需要两个参数的匿名方法。大括号里面显然是方法的主体:

      (o, e) => { finishedCallback(contactDetailWindow.DialogResult)
      

      Lambda 表达式很难用几句话来解释。我想您必须查看文档和一些示例。

      【讨论】:

        猜你喜欢
        • 2012-11-26
        • 2013-10-23
        • 2021-09-02
        • 2011-06-15
        • 1970-01-01
        • 2017-03-29
        • 2016-02-19
        • 1970-01-01
        相关资源
        最近更新 更多