패턴매칭
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 { /* 생략 */ }
C#
복사
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;
}
C#
복사
참조형 인자 옵션
ref: 쓰기가능
in: 쓰기 불가
out: 쓰기 필수
널 병합 연산자
if (list == null)
list = new List<int>();
list ??= new List<int>();
C#
복사
익명 타입
var a = new {Name = "Name", Description = ""};
C#
복사
Shallow copy vs Deep copy
배열을 a[] = b[] 와 같은 식으로 대입 시 참조값만 복사가 된다. 따라서 값만을 복사하고 싶을 경우는 a[] = b[].Clone() as int[]; 와 같이 사용해야 한다.
Static 키워드
Static 키워드는 순서대로 컴파일됨으로 주의가 필요하다.
readonly 속성은 new 키워드로 override 해도 소용이 없다, 그대로 readonly 이다.
프로퍼티
속성 setter에서 예외가 throw되는 경우 이전 값을 유지하세요.
속성 getter에서 예외를 throw하면 안 됩니다.
함수내에서 선언하는 참조타입 변수는 전역으로 선언하라
값타입은 stack영역에 들어가므로 가비지 컬렉터의 대상이 아니며, 함수 종료시 해제된다.
참조타입은 heap영역에 들어가며 함수가 종료되도 해제되지 않고, 가비지 컬렉터의 대상이 된다.
그 함수를 사용하면 사용할수록 가비지 컬렉션이 빈번하게 일어날 것이다.
기타
소수점 아레 자리수가 크게 상관없는 샘플수 같은건 float 말고 int를 쓰자
struct 가 포함하는 자료형이 32, 64비트보다 크면 readonly struct, in 을 이용하거나 struct, ref 를 이용하자
struct, in 혹은 값 전달은 방어적 복사가 일어나 효율적이지 못하다