다음을 통해 공유


식 본문 멤버(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# 프로그래밍 가이드)을 참조하세요.

속성

식 본문 정의를 사용하여 속성 getset 접근자를 구현할 수 있습니다. 다음 예제에서는 이를 수행하는 방법을 보여줍니다.

public class Location
{
   private string locationName;

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

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

속성에 대한 자세한 내용은 속성(C# 프로그래밍 가이드)을 참조하세요.

이벤트

마찬가지로 이벤트 addremove 접근자가 식 본문일 수 있습니다.

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 접근자가 단순 할당을 수행하는 경우 인덱서의 getset 접근자는 식 본문 정의로 구성됩니다.

다음 예제에서는 일부 스포츠의 이름이 포함된 내부 String 배열을 포함하는 Sports라는 클래스를 정의합니다. 인덱서의 getset 접근자는 둘 다 식 본문 정의로 구현됩니다.

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# 프로그래밍 가이드)를 참조하세요.

참고 항목