패턴매칭

private void PrintArea(List<Shape> shapes)
{
    foreach (var shape in shapes)
    {
        switch (shape)
        {
            // const pattern
            case null:
                WriteLine("Skip");
                break;

            // type pattern
            case Circle c:
                WriteLine($"원: {c.Radius * c.Radius * Math.PI}");
                break;
            case Rect r when r.Width == r.Height:
                WriteLine($"정사각형: {r.Width * r.Width}");
                break;
            case Rect r:
                WriteLine($"사각형: {r2.Width * r2.Height}");
                break;

            default:
                WriteLine("모르는 모양");
                break;
        }
    }
}

class Shape {}
class Circle : Shape { /* 생략 */ }
class Rect : Shape { /* 생략 */ }
switch (mark)
{
    case int n when n >= 80:
        Console.WriteLine("Grade is A");
        break;
    case int n when n >= 60:
        Console.WriteLine("Grade is B");
        break;
    case int n when n >= 40:
        Console.WriteLine("Grade is C");
        break;
    default:
        Console.WriteLine("Grade is D");
        break;
}

참조형 인자 옵션

ref: 쓰기가능

in: 쓰기 불가

out: 쓰기 필수

널 병합 연산자

if (list == null)
    list = new List<int>();

list ??= new List<int>();

익명 타입

var a = new {Name = "Name", Description = ""};

Shallow copy vs Deep copy

배열을 a[] = b[] 와 같은 식으로 대입 시 참조값만 복사가 된다. 따라서 값만을 복사하고 싶을 경우는 a[] = b[].Clone() as int[]; 와 같이 사용해야 한다.

Static 키워드

Static 키워드는 순서대로 컴파일됨으로 주의가 필요하다.

readonly 속성은 new 키워드로 override 해도 소용이 없다, 그대로 readonly 이다.

프로퍼티

✔️ 속성 setter에서 예외가 throw되는 경우 이전 값을 유지하세요.

❌ 속성 getter에서 예외를 throw하면 안 됩니다.