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