
Effective C# Item 2
const - 컴파일 타임 상수, 컴파일 타임에 변수가 값으로 대체
readonly - 런타임 파일 상수, 런타임에 값이 평가, 상수에 대한 참조로 컴파일
컴파일타임 상수보다는 런타임 상수를 사용
// 컴파일타임 상수 public const int Millennum = 2000; // 런타임 상수 public static readonly int ThisYear = 2024;컴파일타임 상수는 런타임 상수에 비해 유연성이 떨어진다.
컴파일타임 상수는 성능이 매우 중요하고 상수의 값이 절대로 바뀌지 않는 경우에만 제한적으로 사용
컴파일타임 상수는 내장 자료형이어야만 한다.
// 컴파일되지 않는다. 대신 readonly를 사용해야 한다. private const DateTime classCreation = new DateTime(2000, 1, 1, 0, 0, 0);
readonly의 유연성
public class MyClass { public static readonly int ThisYear; public MyClass(int year) { ThisYear = year; } }readonly는 생성자에서 초기화 될 수 있다.
동일 클래스의 인스턴스라 하더라도 인스턴스별로 서로 다른 값을 가질 수 있다.
프로그램 유지보수/호환성
Infrastructure라는 어셈블리 내에 다음과 같이 정의한다.public class UsefulValues { public static readonly int StartValue = 5; public const int EndValue = 10; }다른 어셈블리에서 이 값들을 다음과 같이 사용한다고 가정한다.
for (int i = UsefulValues.StartValue; i < UsefulValues.EndValue; i++) Console.WriteLine($"value is {i}");Value is 5 Value is 6 ... Value is 9Infrastructure 어셈블리에서 다음과 같이 수정한다.
public class UsefulValues { public static readonly int StartValue = 105; public const int EndValue = 120; }Infrastructure를 수정했으므로 응용프로그램 전체를 리빌드 하지 않고 Infrastructure만 리빌드했다고 가정한다.
기댓값 Value is 105 Value is 106 ... Value is 119하지만 실제로 수행해보면 아무런 결과도 출력되지 않는다.
사용중인 프로그램에서 StartValue의 값은 105로 수정되었지만 EndValue의 값은 수정하기 전 값인 10을 계속해서 사용하기 때문이다.
readonly를 사용하면 응용프로그램을 완전히 리빌드하지 않더라도 관련 어셈블리의 변경 사항을 올바르게 반영할 수 있다.
const 사용
컴파일할 때 사용되는 상숫값을 정의할 때
특성(attribute)의 매개변수, switch/case 문의 레이블, enum 정의 시 사용하는 상수 등