Favicon

Lambda expressions, operator

Peponi11/27/20244m

C#
SyntaxOperator=>

1. Introduction

람다 기호 => 는 두 가지 기능을 한다.

  • 람다 연산자 : 람다 식에서 =>는 입력 매개변수와 본문을 구분한다.
  • 식 본문 정의 : 식 본문 정의에서 =>는 멤버 이름과 구현을 구분한다.

2. 람다 연산자

다음은 람다 식을 정의하는 방법을 보여준다.

Action foo = () => Console.WriteLine("Hello, World!");
Func<string> bar = () => "Hello, World!";

형식 추론이 가능한 경우, 람다 식의 매개 변수에 대한 형식 선언을 생략할 수 있다.

Func<string, string> foo = message => $"Hello {message}";   // 매개 변수가 하나인 경우 괄호 () 생략 가능
Func<string, string, string> bar = (messageA, messageB) => $"{messageA}{messageB}";

형식 추론이 불가능한 경우 형식을 지정할 수 있다.

Func<string, string, string> bar = (string messageA, string messageB) => $"{messageA}{messageB}";

무시 항목을 이용하여 사용하지 않을 매개 변수를 지정할 수 있다.

Func<string, string, string> bar = (_, messageB) => $"{messageB}";

LINQ를 사용할 때도 람다 식을 이용할 수 있다.

List<int> foo = new() { 1, 2, 3, 4, 5 };
var bar = foo.Where(x => x > 3);
 
Console.WriteLine(string.Join(", ", bar));
 
/* output:
4, 5
*/

C# 12 버전부터는 람다 식에 선택적 매개 변수 기능이 지원된다.

  • 람다 식의 매개 변수에 기본값 설정이 가능하다.
  • 람다 식의 매개 변수에 배열 (params) 설정이 가능하다.
var getValue = (int value = 5) => value;
 
var multiply = (params int[] values) =>
{
    int rtn = 1;
    foreach (var value in values) rtn *= value;
    return rtn;
};
 
Console.WriteLine(getValue());
Console.WriteLine(multiply(1, 2, 3, 4, 5));
 
/* output:
5
120
*/

3. 식 본문 정의

식 본문 정의 구문은 다음과 같다.

member => expression;
  • expression의 반환 형식은 멤버의 반환 형식이거나 암시적으로 변환할 수 있어야 한다.
  • 멤버의 형식이 다음과 같은 경우, expression문 식이어야 한다.
    1. void
    2. 생성자
    3. 소멸자
    4. 프로퍼티 또는 인덱서의 setter

다음은 식 본문 정의의 구현을 보여준다.

internal class Foo
{
    private string _name;
 
    public string Property
    {
        get => _name;
        set => _name = value;
    }
 
    public string ReadonlyProperty => _name;
 
    public Foo(string name) => _name = name;
 
    public string GetName() => ReadonlyProperty;
}

4. 참조 자료