[C#] const & readonly (컴파일타임 상수 & 런타임 상수)
## 개요
C#은 두가지 상수형을 제공한다
각자의 특성에 맞게 올바르게 사용해야한다
## const
public const int MILLENNIUM = 2000;
- compile-time 상수
- 컴파일시에 const 상수형 변수가 사용되는 위치(code)가 실질적인 값으로 치환
- readonly에 비해 다소 빠르지만 유연성이 떨어짐
- 변수 선언시에만 초기화 가능 (생성자를 통해 동적 초기화 불가)
- 내장자료형(정수형, 실수형 등)이나 enum, string에 대해서만 선언 가능. 즉, 숫자와 문자열에 한해서만 사용가능.
- 기본적으로 static이므로 동일타입의 여러 인스턴스에서도 항상 같은 값
- 서비스 기간동안 불변값이어야하고 피치못할 변경 발생시 참조하는 모든 어셈블리 재컴파일 후 재배포 필요
## readonly
public static readonly int THIS_YEAR = 2023;
- runtime 상수
- 컴파일시에 readonly 상수형 변수가 사용되는 위치가 참조값으로 치환
- const에 비해 다소 느리지만 유연성이 좋음
- 변수 선언시 또는 생성자에서 초기화 가능 (생성자 호출이 완료된 이후에는 초기화 불가)
- 어떤 자료형으로도 선언 가능 (대표적으로 1회만 초기화 되어야 하는 singleton의 private instance 멤버변수)
- 동일타입의 인스턴스별로 서로 다른 값 (static 선언을 통해 같은 값으로도 설정 가능)
- 초기화 이후 프로그램 동작동안 불변값. 변경 발생시 해당 변수가 선언된 어셈블리만 재컴파일 및 배포가능
## 결론
- readonly 대신 const를 사용했을때 유일한 장점은 수행성능
- const는 수행성능이 매우 중요하고, 상수의 값이 절대로 바뀌지 않는 경우에 한해서만 사용하는것이 좋다.
- 즉 평소엔 readonly를 주로 사용하고 const는 필요하다고 판단되는 시점에만 readonly를 대체해서 사용하자
## References
- 책 Effective C# (Bill Wagner)