View Snippet-14.cs
switch (o)
{
case int n when n > 0: return 1;
// 절대 매칭될 일이 없지만, 컴파일러는 이걸 당신에게 경고하지 않을 것입니다.
case int n when n > 1: return 2;
}
View Snippet-13.cs
switch (o)
{
case int n: return 1;
// 에러: 이 분기는 이미 이전 case에서 처리되었습니다.
case int n when n == 1: return 2;
}
View Snippet-12.cs
if (o is int n && n == 1) return 1;
if (o is string s && s == "") return 2;
if (o is int n2 && n2 == 2) return 3;
return -1;
View Snippet-11.cs
switch (o)
{
// 만약 o가 int일 경우 최소한 하나 이상의 타입 검사와 언박싱이 들어가서
// 생성된 코드는 최적화가 덜 될 것입니다.
case int n when n == 1: return 1;
case string s when s == "": return 2;
case int n when n == 2: return 3;
default: return -1;
}
View Snippet-10.cs
public static void FizzBuzz(object o)
{
// 모든 경우는 값이 null이 아닐 때만 매칭할 수 있습니다.
if (o != null)
{
if (o is string s &&
(s.Contains("Fizz") || s.Contains("Buzz")))
{
Console.WriteLine(s);
return;
View Snippet-09.cs
public static void FizzBuzz(object o)
{
switch (o)
{
case string s when s.Contains("Fizz") || s.Contains("Buzz"):
Console.WriteLine(s);
break;
case int n when n % 5 == 0 && n % 3 == 0:
Console.WriteLine("FizzBuzz");
break;
View Snippet-08.cs
public static int Count<T>(this IEnumerable<T> e)
{
switch (e)
{
case ICollection<T> c: return c.Count;
case IReadOnlyCollection<T> c: return c.Count;
// concurrent collection일 때 매칭합니다.
case IProducerConsumerCollection<T> pc: return pc.Count;
// e가 null이 아닐 때 매칭합니다.
case IEnumerable<T> _: return e.Count();
View Snippet-07.cs
public void IsVar(object o)
{
if (o is var x) Console.WriteLine($"x: {x}");
}
View Snippet-06.cs
public void WithNullPropagation(IEnumerable<string> s)
{
if (s?.FirstOrDefault(str => str.Length > 10)?.Length is int length)
{
Console.WriteLine(length);
}
// 비슷한 방식으로
if (s?.FirstOrDefault(str => str.Length > 10)?.Length is var length2 && length2 != null)
{
View Snippet-05.cs
public void VarPattern(IEnumerable<string> s)
{
if (s.FirstOrDefault(o => o != null) is var v
&& int.TryParse(v, out var n))
{
Console.WriteLine(n);
}
}