表达式主体定义
原文地址https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members
通過表達式主體定義,可采用非常簡潔的可讀形式提供成員的實現(xiàn)。?只要任何支持的成員(如方法或屬性)的邏輯包含單個表達式,就可以使用表達式主體定義。?表達式主體定義具有下列常規(guī)語法:
C#
member => expression;其中“expression”是有效的表達式。
C# 6 中引入了針對方法和屬性 Get 訪問器的表達式主體定義支持,并在 C# 7.0 中進行了擴展。?表達式主體定義可用于下表列出的類型成員:
| 方法 | C# 6 |
| 構造函數(shù) | C# 7.0 |
| 終結器 | C# 7.0 |
| 屬性 Get | C# 6 |
| 屬性 Set | C# 7.0 |
| 索引器 | C# 7.0 |
方法
expression-bodied 方法包含單個表達式,它返回的值的類型與方法的返回類型匹配;或者,對于返回?void?的方法,其表達式則執(zhí)行某些操作。?例如,替代?ToString?方法的類型通常包含單個表達式,該表達式返回當前對象的字符串表示形式。
下面的示例定義?Person?類,該類通過表達式主體定義替代?ToString。?它還定義向控制臺顯示名稱的?DisplayName?方法。?請注意,ToString?表達式主體定義中未使用?return?關鍵字。
C#
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();
}
}
有關詳細信息,請參閱方法(C# 編程指南)。
構造函數(shù)
構造函數(shù)的表達式主體定義通常包含單個賦值表達式或一個方法調(diào)用,該方法調(diào)用可處理構造函數(shù)的參數(shù),也可初始化實例狀態(tài)。
以下示例定義?Location?類,其構造函數(shù)具有一個名為“name”的字符串參數(shù)。?表達式主體定義向?Name?屬性分配參數(shù)。
C#
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
有關詳細信息,請參閱構造函數(shù)(C# 編程指南)。
終結器
終結器的表達式主體定義通常包含清理語句,例如釋放非托管資源的語句。
下面的示例定義了一個終結器,該終結器使用表達式主體定義來指示已調(diào)用該終結器。
C#
using System;
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}
有關詳細信息,請參閱終結器(C# 編程指南)。
屬性 Get 語句
如果選擇自行實現(xiàn)屬性 Get 訪問器,可以對只返回屬性值的單個表達式使用表達式主體定義。?請注意,未使用?return?語句。
下面的示例定義?Location.Name?屬性,其屬性 Get 訪問器返回支持該屬性的私有?locationName?字段的值。
C#
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
不使用顯式?set?語句也可實現(xiàn)使用表達式主體定義的只讀屬性。?語法為:
C#復制
PropertyName => returnValue;下面的示例定義?Location?類,其只讀?Name?屬性以表達式主體定義的形式實現(xiàn),該表達式主體定義返回私有?locationName?字段值。
C#
public class Location
{
private string locationName;
public Location(string name) => locationName = name;
public string Name => locationName;
}
有關詳細信息,請參閱屬性(C# 編程指南)。
屬性 Set 語句
如果選擇自行實現(xiàn)屬性 Set 訪問器,可以對單行表達式使用表達式主體定義,該單行表達式用于對支持該屬性的字段賦值。
下面的示例定義?Location.Name?屬性,其屬性 Set 語句將其輸入?yún)?shù)賦給支持該屬性的私有?locationName?字段。
C#
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
有關詳細信息,請參閱屬性(C# 編程指南)。
索引器
與屬性一樣,如果索引器的 Get 訪問器包含單個返回值的語句或其 Set 訪問器執(zhí)行簡單的賦值,則 Get 和 Set 訪問器包含表達式主體定義。
下面的示例定義名為?Sports?的類,其中包含一個內(nèi)部?String?數(shù)組,該數(shù)組包含大量體育運動的名稱。索引器的 Get 和 Set 訪問器都以表達式主體定義的形式實現(xiàn)。
C#
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;
}
總結
- 上一篇: 51信用卡管家办卡通过率高么
- 下一篇: html中点击照片时放大缩小,基于jqu