잘 안쓰는 기능 is 속성 패턴

혹시 다음의 코드를 보신 적이 있나요?

...
if (value is { })
{
...
}

value is { }에서 { }이 참 낯설게 느껴지는데요, 속성이 없는 속성 패턴입니다.
is not null 하고는 약간 다르게 동작 합니다. 타입이 숫자형일 경우 is not null을 만나면 컴파일 오류가 납니다.

var value = 5;
result = value is not null;     //  오류, CS0037: 'int'는 null 형식으로 변환할 수 없습니다.
Console.WriteLine(result);

이것을 다음처럼 바꿔보면,

var value = 5;
result = value is { };
Console.WriteLine(result);

속성에 접근할 수 있으므로 정상적인 코드이고 true를 반환하게 됩니다.

그런데, is {}라고 쓰는게 어떨 때 편리함을 줄까요? 다음의 코드를 봅시다.

var value = 5;
result = GetResult(result);
Console.WriteLine(result);

bool GetResult<T>(T value) => value is { };

제네릭 인자를 사용할 때 유용하게 쓰일 수 있음을 알 수 있습니다.

is에서 속성 패턴을 이용하면 다음의 가독성이 떨어지는 코드를

// 오늘이 8월 중 20일 이상이고, 금요일 인지를 비교
var now = DateTime.Now;
var result = now.Month == 8 && now.Day >= 20 && now.DayOfWeek == DayOfWeek.Friday;
Console.WriteLine(result);

속성 패턴을 이용해 다음처럼 가독성을 높일 수 있습니다.

// 오늘이 8월 중 20일 이상이고, 금요일 인지를 비교
result = now is { Month: 8, Day: >= 20, DayOfWeek: DayOfWeek.Friday };
Console.WriteLine(result);

is 연산자에서 쓰이는 속성 패턴은 switch 식에서도 동일하게 사용할 수 있습니다.

패턴 - C# 참조 | Microsoft Docs

15개의 좋아요

깔끔하니 정말 보기 좋네요. 얼마전에 날짜 캘린더 출력할때 완전 지저분 했는데 이렇게 하면 정말 가독성이 좋겠네요.

3개의 좋아요