delegate 연산자

delegate 연산자

delegate 연산자는 대리자 타입으로 변환할 수 있는 무명 메서드(anonymous method)를 만들어요.

이 연산자는 C# 2.0부터 사용할 수 있어요.

무명 메서드는 xref:System.Action?displayProperty=nameWithType이나 xref:System.Func`1?displayProperty=nameWithType 같은 타입으로 변환할 수 있는데요, 실제로 많은 .NET API가 이런 타입을 인자로 사용해요.

:::code language="csharp" source="snippets/shared/DelegateOperator.cs" id="AnonymousMethod":::

[!NOTE] 람다 식이 무명 함수를 만드는 더 간결하고 표현력 좋은 방법이에요. => 연산자를 쓰면 람다 식을 만들 수 있어요:

:::code language="csharp" source="snippets/shared/DelegateOperator.cs" id="Lambda":::

외부 변수를 캡처하는 등 람다 식의 여러 기능은 람다 식에서 더 다뤄요.

delegate 연산자를 쓸 때는 매개 변수 목록을 생략할 수 있어요. 목록을 생략하면 어느 매개 변수 목록의 대리자 타입으로든 변환할 수 있는 무명 메서드가 만들어져요. 다음 예시를 볼게요:

:::code language="csharp" source="snippets/shared/DelegateOperator.cs" id="WithoutParameterList":::

이 기능이 바로 람다 식이 지원하지 않는 무명 메서드의 유일한 특징이에요. 그 외의 경우에는 람다 식을 써서 인라인 코드를 작성하는 게 좋아요. 무명 메서드가 실제로 쓰지 않는 입력 매개 변수를 두 개 이상 지정할 땐 무시 항목(discards)을 쓸 수 있어요:

:::code language="csharp" source="snippets/shared/DelegateOperator.cs" id="SnippetDiscards":::

이전 버전과의 호환성을 위해, 매개 변수가 하나뿐인데 그 이름이 _라면 컴파일러는 _를 무명 메서드 안에서 그 매개 변수의 이름으로 취급해요.

무명 메서드를 선언할 땐 static 한정자를 쓸 수 있어요:

:::code language="csharp" source="snippets/shared/DelegateOperator.cs" id="SnippetStatic":::

정적 무명 메서드는 바깥쪽 범위의 지역 변수나 인스턴스 상태를 캡처할 수 없어요.

delegate 키워드는 대리자 타입을 선언할 때도 쓰여요.

컴파일러는 메서드 그룹에서 만든 대리자 객체를 캐시할 수 있어요. 다음 메서드를 생각해 볼게요:

static void StaticFunction() { }

이 메서드 그룹을 대리자에 할당하면 컴파일러가 대리자를 캐시해요:

Action a = StaticFunction;

C# 언어 사양

자세한 내용은 C# 언어 사양무명 함수 식 섹션을 참고하세요.

더 알아보기

출처: delegate operator - C# reference