'=>'是什么mean(在函数/属性上下文中)?

时间:2017-11-24 07:05:03

标签: c# function lambda operators expression-body

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

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

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

=>运算符在此上下文中的含义是什么?

由于 [R

3 个答案:

答案 0 :(得分:4)

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

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

此:

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

相当于:

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

答案 1 :(得分:1)

正如@sweeper在你的例子中所说,它们与lambda表达式无关,因为它们是表达式体操作符(在C#6中引入并在7中扩展)。它也用于表示lambda表达式,因此它的用法是两倍。

有关=>的每次使用的更多信息运营商可以在这里找到; https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-operator

答案 2 :(得分:0)

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

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

  2. 表达身体的功能。这就是我们在这里所拥有的。

  3. 要了解 => 的含义,请查看以下简单示例:

    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
      倾倒对象(String)
       2 x 7 = 14

    Try it in DotNetFiddle

    这里,NotImplementedException代码,只是告诉你(开发人员)属性和索引器没有实现但应该被替换为某个函数:

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

    注意在早期版本的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中,您必须输入更少的内容才能获得相同的结果。