13.4.1 배경: 읽기 전용 변수를 사용한 암시적 복사
C#은 오랫동안 구조체에 대해 암시적 복사를 수행해 왔으며, 관련 내용들은 C# 명세에 모두 기술되어 있다. 하지만 Noda Time을 개발하면서 실수로 특정 필드를 읽기 전용으로 선언하는 것을 누락했고, 이상하리만큼 성능이 개선되는 것을 보기 전까지 이러한 사실을 전혀 알지 못했다.
우선 간단한 예를 살펴보자. Year, Month, Day라는 세 개의 속성을 가진 YearMonthDay라는 구조체를 선언할 것이다. 몇 가지 이유 때문에 내장 타입인 DateTime 타입을 사용하지 않았는데, 그에 대해서는 나중에 살펴보자. 다음에 YearMonthDay에 대한 구현 코드를 나타냈다. 정말 간단하게 구현했다(예제일 뿐이므로 유효성 검증 코드도 포함시키지 않았다).
예제 13-15 간단한 year/month/day 구조체 ▶ YearMonthDay.cs
public struct YearMonthDay
{
public int Year { get; }
public int Month { get; }
public int Day { get; }
public YearMonthDay(int year, int month, int day) =>
(Year, Month, Day) = (year, month, day);
}
이제 YearMonthDay 타입으로 두 개의 필드를 가지는 새로운 클래스를 작성해 보자. 하나는 읽기 전용이고, 나머지 하나는 읽고 쓸 수 있는 필드다. 그리고 두 필드의 Year 속성에 접근하는 코드를 작성해 보자.