혹시 다음의 코드를 보신 적이 있나요?
...
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
식에서도 동일하게 사용할 수 있습니다.