람다 표현식

짧은 연산을 다른 메서드에 전달하려는 경우, 그리고 해당 연산을 사용하는 호출 옆에 둘 때 가장 명확한 경우 람다 식을 선택합니다. 인라인 규칙은 항목을 선택하거나 변환하는 방법을 독자에게 표시합니다. 명명된 메서드를 사용하면 세부 정보를 검사하기 전에 작업의 목적을 따를 수 있습니다.

Tip

이 문서에서는 C# 메서드 및 컬렉션을 알고 있는 개발자를 위한 실용적인 선택을 알려줍니다. 전체 람다 구문 및 규칙은 람다 식 참조를 참조하세요.

람다 식은 다른 코드 조각에 동작이 필요한 위치에 작성하는 명명되지 않은 함수입니다.

다음 람다는 세션을 인자로 받아 세션에 열린 좌석이 있는지 여부를 반환합니다.

session => session.Registered < session.Capacity

=> 연산자는 왼쪽의 매개 변수를 오른쪽의 본문과 구분합니다. "goes to"라고 읽습니다.

메서드에 동작 전달

많은 .NET API는 특정 매개 변수 목록 및 반환 형식의 동작을 나타내는 형식인 대리자를 허용합니다. 람다는 해당 동작을 제공합니다. Func 및 Action와 같은 대리자 형식에 대한 소개는 람다 식, 대리자 및 이벤트를 참조하세요.

다음 예제는 워크숍 세션과 함께 작동합니다. A WorkshopSession에는 제목, 소요 시간, 용량 및 등록 수가 포함됩니다.

int maximumMinutes = 60;

var shortSessions = sessions
    .Where(session => session.DurationMinutes <= maximumMinutes)
    .OrderBy(session => session.Title);

foreach (WorkshopSession session in shortSessions)
{
    Console.WriteLine(session.Title);
}

첫 번째 람다는 Where에 유지할 세션을 알려줍니다. 두 번째는 OrderBy에 어떤 값을 기준으로 정렬할지 알려줍니다. 메서드는 각 규칙의 세부 정보를 모르고 동작을 받습니다.

매개변수 양식 선택

명확성을 유지하는 가장 짧은 매개 변수 양식을 선택합니다.

session => session.DurationMinutes <= 60

하나의 매개 변수에 대해 컴파일러가 형식을 유추할 수 있는 경우 괄호를 생략합니다. 매개변수가 없으면 빈 괄호를 사용하세요:

() => DateTime.Now

매개변수가 두 개 이상이면 괄호를 사용합니다.

(left, right) => left + right

일반적으로 람다를 수신하는 메서드는 컴파일러가 매개 변수 형식을 유추하기에 충분한 정보를 제공합니다. 타입 추론에 도움이 필요하거나 타입이 명확성을 향상시킬 때 명시적 타입을 작성합니다.

(WorkshopSession session) => session.Title

람다 식 참조는 매개 변수 한정자, 특성, 기본값 및 기타 특수화된 양식을 다룹니다.

식 또는 문의 본문을 선택

하나의 식으로 결과를 계산하는 경우 식 람다 식을 사용합니다.

session => session.Registered < session.Capacity

작업에 둘 이상의 문이 필요한 경우 문 형식 람다를 사용합니다. 본문을 중괄호로 묶고 람다가 값을 반환할 때는 return를 포함합니다.

var descriptions = sessions.Select(session =>
{
    int seatsLeft = session.Capacity - session.Registered;
    string availability = seatsLeft > 0 ? $"{seatsLeft} seats left" : "full";
    return $"{session.Title}: {availability}";
});

Console.WriteLine(string.Join(Environment.NewLine, descriptions));

문 본문이 있는 람다식을 간략하게 유지합니다. 본문에 여러 단계가 필요하거나 동일한 논리가 두 번 이상 나타나는 경우 동작에 로컬 함수 또는 일반 메서드를 사용하여 설명적인 이름을 붙입니다.

외부 스코프에서 값 캡처하기

람다는 주변 메서드에 선언된 변수를 사용할 수 있습니다. 이 사용을 캡처라고합니다. 첫 번째 예제에서 선택 람다는 다음을 캡처합니다.maximumMinutes

int maximumMinutes = 60;
var shortSessions = sessions.Where(
    session => session.DurationMinutes <= maximumMinutes);

캡처를 사용하면 짧은 규칙이 로컬 컨텍스트를 사용할 수 있습니다. 람다는 해당 값의 복사본이 아니라 변수 자체를 캡처합니다. 람다가 실행되기 전에 변수가 변경되면 람다는 현재 값을 확인합니다.

필요한 맥락을 쉽게 식별할 수 있게 하세요. 람다에 주변 상태가 필요하지 않은 경우 static를 추가하여 우발적 캡처를 방지하고 독자가 해당 독립성을 알 수 있게 합니다.

var openSessions = sessions.Where(
    static session => session.Registered < session.Capacity);

정적 람다는 매개 변수, 람다 내에서 선언한 값, 상수 및 정적 멤버를 사용할 수 있습니다. 주변 코드에서 지역 변수 또는 인스턴스 상태를 사용할 수 없습니다.

람다, 메서드 그룹 또는 로컬 함수 선택

여러 C# 형식은 대리자 매개 변수에 동작을 제공할 수 있습니다.

  • 호출문 옆에서 읽기 쉬운 짧은 동작에는 람다 식을 사용합니다.
  • 기존 메서드에 필수 서명이 있고 해당 이름이 동작을 설명하는 경우 메서드 그룹을 사용합니다.
  • 포함된 멤버에 다시 사용할 수 있는 명명된 논리, 재귀 또는 본문이 인라인 람다로 작성하기에 너무 긴 경우 로컬 함수를 사용합니다.
  • 여러 멤버에 동작이 필요한 경우 일반적인 메서드를 사용합니다.

메서드 그룹은 인수 목록이 없는 메서드 이름입니다. 컴파일러는 일치하는 메서드를 필요한 대리자 형식으로 변환합니다.

var openSessions = sessions.Where(HasOpenSeats);

foreach (WorkshopSession session in openSessions)
{
    Console.WriteLine($"Open: {session.Title}");
}

static bool HasOpenSeats(WorkshopSession session) =>
    session.Registered < session.Capacity;

Where(HasOpenSeats)는 Where(session => HasOpenSeats(session))와 동일한 규칙을 더 적은 코드로 전달합니다. 메서드 이름은 규칙이 테스트하는 내용을 독자에게 알려줍니다. 인라인 비교는 해당 규칙을 테스트하는 방법을 보여 줍니다. 인수를 추가하거나, 작업을 결합하거나, 호출을 더 명확하게 만들 때 람다 래퍼를 유지합니다.

자세한 로컬 비교는 로컬 함수를 참조하세요.

또한, 다음을 참조하세요.