【问题标题】:What does '=>' mean (in functions / property context)?'=>' 是什么意思(在函数/属性上下文中)?
【发布时间】:2018-05-08 03:41:52
【问题描述】:

我在开发 Xamarin 应用程序时使用 Lambdas 自动生成了代码:

public override string this[int position] => throw new NotImplementedException();

public override int Count => throw new NotImplementedException();

=> 运算符在这种情况下是什么意思?

谢谢 回复

【问题讨论】:

  • 谷歌“c# lambda 表达式”
  • 这些不是 lambda 表达式。问题标题具有误导性。重新打开,因为详细说明什么 lambda 表达式的答案在这里没有用。这些是expression-bodied members
  • 对不起标题,请您解释一下这两个语句的作用
  • 为重新打开这个点赞。我记得第一次看到这些,直到今天仍然很难用谷歌搜索“=>”。 :)

标签: c# function lambda operators expression-body


【解决方案1】:

这些不是 lambda,它们是 Expression-bodied Function Members

在属性的上下文中,这些基本上是属性的 getter,简化为单个表达式(而不是整个语句)。

这个:

public override int Count => throw new NotImplementedException();

相当于:

public override int Count {
    get { throw new NotImplementedException(); }
}

【讨论】:

    【解决方案2】:

    正如@sweeper 在您的示例中所说,它们与 lambda 表达式无关,因为它们是表达式主体运算符(在 C# 6 中引入并在 7 中扩展)。它也用于表示一个 lambda 表达式,所以它的用法是双重的。

    更多关于=> 操作符用法的信息可以在这里找到; https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-operator

    【讨论】:

      【解决方案3】:

      首先,让我们澄清一下=>operator 目前在两种不同的上下文中使用:

      1. Lambda 表达式。 通常你会在 Linq 中看到它们,例如
        var query = Customers.OrderBy(x => x.CompanyName);

      2. 表达式体函数。这就是我们在这里所拥有的。

      为了理解=>是什么意思,请看下面这个简单的例子:

      using System;
      
      public class Program
      {
          public void Main()
          {
              var obj = new Test();
              obj.Count.Dump();
              obj[7].Dump();
          }
      
      
          class Test
          {
              public int Count => 1;
              public string this[int position] => $"2 x {position} = {(2*position)}";
          }
      }
      

      转储对象(Int32)
      1
      转储对象(字符串)
      2 x 7 = 14

      Try it in DotNetFiddle

      这里,NotImplementedException 代码只是用来告诉您(开发人员)该属性和索引器没有实现但应该实现,被一些函数替换:

      • Count 是一个只读属性,总是返回 1
      • 每当您将[ ... ] 应用于对象时,都会返回双倍索引

      注意,在早期版本的 C# 中,您必须编写:

      class Test
      {
              public int Count { get { return 1; } }
              public string this[int position] { 
                  get { return String.Format("2 x {0} = {1}", 
                                             position, (2*position).ToString()); }}
      }
      

      相当于上面的代码。因此,本质上在 C#7 中,您只需输入更少的内容即可获得相同的结果。

      【讨论】:

        猜你喜欢
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多