【学习笔记】表达式主体定义的成员(常规语法:member => expression;)

在阅读 .NET Core 源码的时候,表达式主体定义的成员随处可见,通过表达式主体定义,可采用非常简洁的可读形式提供成员的实现。 只要任何支持的成员(如方法或属性)的逻辑只包含单个表达式,就可以使用表达式主体定义。 

表达式主体定义具有下列常规语法

member => expression;

其中“expression”是有效的表达式。

C# 6 中引入了针对方法和只读属性的表达式主体定义支持,并在 C# 7.0 中进行了扩展。 表达式主体定义可用于下表列出的类型成员:

示例如下:

1、方法

expression-bodied 方法包含单个表达式,它返回的值的类型与方法的返回类型匹配;或者,对于返回 void 的方法,其表达式则执行某些操作。

using System;

public class Person
{
   public Person(string firstName, string lastName)
   {
      fname = firstName;
      lname = lastName;
   }

   private string fname;
   private string lname;

   public override string ToString() => $"{fname} {lname}".Trim();
   public void DisplayName() => Console.WriteLine(ToString());
}

class Example
{
   static void Main()
   {
      Person p = new Person("Mandy", "Dejesus");
      Console.WriteLine(p);
      p.DisplayName();
   }
}

2、只读属性

语法:

PropertyType PropertyName => expression;

示例:

public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

3、属性

从 C# 7.0 开始,可以使用表达式主体定义来实现属性 get 和 set 访问器。 下面的示例演示其实现方法:

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

4、构造函数

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

5、索引器

索引器的 get 和 set 访问器都以表达式主体定义的形式实现,如下所示:

using System;
using System.Collections.Generic;

public class Sports
{
   private string[] types = { "Baseball", "Basketball", "Football",
                              "Hockey", "Soccer", "Tennis",
                              "Volleyball" };

   public string this[int i]
   {
      get => types[i];
      set => types[i] = value;
   }
}

6、终结器

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;

   ~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}

 

本文内容摘自微软官方文档:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members

posted @ 2022-02-18 21:34  谢友海  阅读(438)  评论(0编辑  收藏  举报