식 본문 멤버(C# 프로그래밍 가이드)
식 본문 정의를 사용하면 간결하고 읽기 쉬운 형식으로 멤버의 구현을 제공할 수 있습니다. 메서드 또는 속성과 같은 지원되는 멤버에 대한 논리가 단일 식으로 구성된 경우 식 본문 정의를 사용할 수 있습니다. 식 본문 정의의 일반 구문은 다음과 같습니다.
member => expression;
여기서 expression은 유효한 식입니다.
식 본문 정의는 다음 형식 멤버와 함께 사용할 수 있습니다.
메서드
식 본문 메서드는 형식이 메서드의 반환 형식과 일치하는 값을 반환하거나 void
를 반환하는 메서드의 경우 일부 작업을 수행하는 단일 식으로 구성됩니다. 예를 들어 ToString 메서드를 재정의하는 형식에는 일반적으로 현재 개체의 문자열 표현을 반환하는 단일 식이 포함되어 있습니다.
다음 예제에ToString 메서드를 식 본문 정의로 재정의하는 Person
클래스를 정의합니다. 또한 이름을 콘솔에 표시하는 DisplayName
메서드를 정의합니다. return
키워드는 ToString
식 본문 정의에 사용되지 않습니다.
using System;
namespace ExpressionBodiedMembers;
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# 프로그래밍 가이드)를 참조하세요.
읽기 전용 속성
식 본문 정의를 사용하여 읽기 전용 속성을 구현할 수 있습니다. 이를 위해 사용하는 구문은 다음과 같습니다.
PropertyType PropertyName => expression;
다음 예제에서는 Location
클래스를 정의합니다. 이 클래스의 읽기 전용 Name
속성은 locationName
비공개 필드의 값을 반환하는 식 본문 정의로 구현됩니다.
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
속성에 대한 자세한 내용은 속성(C# 프로그래밍 가이드)을 참조하세요.
속성
식 본문 정의를 사용하여 속성 get
및 set
접근자를 구현할 수 있습니다. 다음 예제에서는 이를 수행하는 방법을 보여줍니다.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
속성에 대한 자세한 내용은 속성(C# 프로그래밍 가이드)을 참조하세요.
이벤트
마찬가지로 이벤트 add
및 remove
접근자가 식 본문일 수 있습니다.
public class ChangedEventArgs : EventArgs
{
public required int NewValue { get; init; }
}
public class ObservableNum(int _value)
{
public event EventHandler<ChangedEventArgs> ChangedGeneric = default!;
public event EventHandler Changed
{
// Note that, while this is syntactically valid, it won't work as expected because it's creating a new delegate object with each call.
add => ChangedGeneric += (sender, args) => value(sender, args);
remove => ChangedGeneric -= (sender, args) => value(sender, args);
}
public int Value
{
get => _value;
set => ChangedGeneric?.Invoke(this, new() { NewValue = (_value = value) });
}
}
이벤트에 관한 자세한 내용은 이벤트(C# 프로그래밍 가이드)를 참조하세요.
생성자
생성자에 대한 식 본문 정의는 일반적으로 생성자의 인수를 처리하거나 인스턴스 상태를 초기화하는 단일 할당 식 또는 메서드 호출로 구성됩니다.
다음 예제에서는 생성자에 name이라는 단일 문자열 매개 변수가 있는 Location
클래스를 정의합니다. 식 본문 정의에서 Name
속성에 인수를 할당합니다.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
자세한 내용은 생성자(C# 프로그래밍 가이드)를 참조하세요.
종료자
종료자에 대한 식 본문 정의에는 일반적으로 관리되지 않는 리소스를 해제하는 문 등의 정리 문이 포함되어 있습니다.
다음 예제에서는 식 본문 정의를 사용하여 종료자가 호출되었음을 나타내는 종료자를 정의합니다.
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
자세한 내용은 종료자(C# 프로그래밍 가이드)를 참조하세요.
인덱서
속성과 마찬가지로, get
접근자가 값을 반환하는 단일 식으로 구성되거나 set
접근자가 단순 할당을 수행하는 경우 인덱서의 get
및 set
접근자는 식 본문 정의로 구성됩니다.
다음 예제에서는 일부 스포츠의 이름이 포함된 내부 String 배열을 포함하는 Sports
라는 클래스를 정의합니다. 인덱서의 get
및 set
접근자는 둘 다 식 본문 정의로 구현됩니다.
using System;
using System.Collections.Generic;
namespace SportsExample;
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;
}
}
자세한 내용은 인덱서(C# 프로그래밍 가이드)를 참조하세요.
참고 항목
.NET