C# 14 확장 블록
I’m happy to translate the article for you, but I need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you requested.
소개
C# 14 extension blocks를 배우면서 .NET Core 9를 타깃으로 합니다. 프로젝트 파일에 다음을 추가하면 됩니다.
확장 메서드란 무엇인가요?
C# 확장 메서드를 사용하면 기존 타입에 새로운 메서드를 추가할 수 있지만, 소스 코드를 수정하거나 서브클래스를 만들 필요가 없습니다. 이 메서드들은 정적 클래스 안에 정의된 정적 메서드이며, 첫 번째 매개변수 앞에 this를 붙여 확장하려는 타입을 지정합니다. 범위에 포함되면 마치 원래 인스턴스 메서드처럼 동작하여 코드가 더 읽기 쉽고 표현력이 풍부해집니다.
확장 블록의 장점
이전 구문과 달리, 확장 블록을 사용하면 타입에 대한 확장 속성, 연산자 및 정적 멤버를 정의할 수 있습니다.
이전 구문
public static class StringExtensions
{
public static string CapitalizeFirstLetter(this string sender)
=> string.IsNullOrEmpty(sender)
? sender
: $"{char.ToUpper(sender[0])}{sender[1..].ToLower()}";
}
새로운 구문
public static class StringExtensions
{
extension(string sender)
{
public string CapitalizeFirstLetter()
=> string.IsNullOrEmpty(sender)
? sender
: $"{char.ToUpper(sender[0])}{sender[1..].ToLower()}";
}
}
사용법
string firstName = "KAREN";
string lastName = "SMITH";
var fullName = $"{firstName.CapitalizeFirstLetter()} {lastName.CapitalizeFirstLetter()}";
“receiver”(확장하고 있는 인스턴스)는 전체 블록에서 한 번만 정의되므로 코드가 더 깔끔하고 체계적입니다.
수신기 예시
public static class BoolExtensions
{
extension(bool value)
{
public string IsEmpty() =>
value switch
{
true => "Yes is empty",
_ => "No is not empty"
};
public string ToYesNo() =>
value switch
{
true => "Yes",
_ => "No"
};
}
}
블록 안에서는 멤버를 일반 인스턴스 멤버처럼 선언합니다; 각 메서드마다 this 매개변수를 반복해서 적을 필요가 없습니다.
정적 연산자 (C# 14 이전에는 지원되지 않음)
public static class EnumerableExtensions
{
// The generic T is defined at the block level
extension(IEnumerable first)
{
// Extension operator
// Note: At least one parameter must match the extended type (IEnumerable)
public static IEnumerable operator +(IEnumerable left, IEnumerable right)
=> left.Concat(right);
// Extension compound assignment (C# 14 feature)
// Allows `collection += item` behavior
public static IEnumerable operator +(IEnumerable left, T item)
=> left.Append(item);
}
}
사용 예시
var list1 = new[] { 1, 2 };
var list2 = new[] { 3, 4 };
var combined = list1 + list2; // Yields { 1, 2, 3, 4 }
Rules for extension operators
-
Static context: Extension operators must be declared
public static, just like standard operators.
정적 컨텍스트: 확장 연산자는 표준 연산자와 마찬가지로public static으로 선언되어야 합니다. -
Identity rule: One of the operator’s parameters must be identity‑convertible to the type being extended (e.g., if you extend
T[], one parameter must beT[]).
동일성 규칙: 연산자의 매개변수 중 하나는 확장되는 타입으로 동일 변환(identity‑convertible)될 수 있어야 합니다(예:T[]를 확장한다면, 매개변수 중 하나는T[]이어야 합니다). -
Compound assignments: C# 14 introduces user‑defined compound assignment operators (such as
+=), which can now be implemented as extensions.
복합 할당: C# 14에서는 사용자 정의 복합 할당 연산자(예:+=)를 도입했으며, 이제 이를 확장으로 구현할 수 있습니다.
제한된 제네릭 연산자
제네릭‑수학 제약(e.g., INumber)과 확장 연산자를 결합하여 숫자 컬렉션에 대한 연산을 수행할 수 있습니다.
public static class NumericExtensions
{
extension(IEnumerable source) where T : INumber
{
public IEnumerable OnlyPositive => source.Where(x => x > T.Zero);
}
}
기사 소스 코드
요약
확장 블록을 사용하면 개발자에게 더 깔끔한 코드를 제공하여 가독성과 유지보수성을 향상시킵니다. 이는 C# 14 이전의 확장 메서드에 비해 뛰어납니다. 팀에서 확장 블록을 도입할 때는 기존의 전통적인 확장 메서드에 익숙한 구성원들에게 이 기능을 충분히 설명해 주세요.


