readonly 키워드는 다음 네 가지 컨텍스트에서 사용할 수 있는 한정자다.
- 필드 선언에서 필드에 대한 할당을 나타내는 readonly는 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있다. 필드 선언과 생성자 내에서 읽기 전용 필드를 여러 번 할당 및 재할당할 수 있다.
- 값 형식은 해당 데이터를 직접 포함하므로 값 형식인 readonly 필드는 변경할 수 없다.
- 참조 형식에는 해당 데이터에 대한 참조가 포함되므로, readonly 참조 형식인 필드는 항상 같은 개체를 참조해야해당 개체를 변경할 수 있다.
- 생성자가 종료된 후에는 readonly 필드를 할당할 수 없다. 이 규칙의 의미는 값 형식과 참조 형식에서 서로 다르다.
- readonly struct 형식 정의에서 readonly는 구조체 형식을 변경할 수 없음을 나타낸다. 자세한 내용은 구조체 형식 문서의 readonly 구조체 섹션을 참조.
- 구조체 형식 내 인스턴스 멤버 선언에서 readonly는 인스턴스 멤버가 구조체의 상태를 수정하지 않음을 나타낸다. 자세한 내용은 구조체 형식 문서의 readonly 인스턴스 멤버 섹션을 참조.
- ref readonly 메서드 반환에서 readonly 한정자는 메서드가 참조를 반환하고 해당 참조에 쓰기가 허용되지 않음을 나타낸다.
readonly struct 및 ref readonly 컨텍스트는 C# 7.2에서 추가되었다. readonly 구조체 멤버는 C# 8.0에서 추가되었다.
읽기 전용 필드 예제
이 예제에서 year 필드의 값은 클래스 생성자에서 할당되었지만 ChangeYear 메서드에서 변경할 수 없다.
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
다음 컨텍스트에서만 readonly 필드에 값을 할당할 수 있다.
- 변수가 선언에서 초기화될 때. 예를 들면 다음과 같다.
public readonly int y = 5;
- 인스턴스 필드 선언을 포함하는 클래스의 인스턴스 생성자.
- 정적 필드 선언을 포함하는 클래스의 정적 생성자.
또한 이러한 생성자 컨텍스트에서는 readonly 필드를 out 또는 ref 매개 변수로 전달하는 것이 유효하다. readonly 키워드와 const 키워드와 다르다. const 필드는 필드 선언에서만 초기화될 수 있다. readonly 필드는 사용된 생성자에 따라 다른 값을 가질 수 있다. 또한 const 필드는 컴파일 시간 상수인 반면, readonly 필드는 다음 예제와 같이 런타임 상수에 사용될 수 있다.
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class SamplePoint
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SamplePoint()
{
// Initialize a readonly instance field
z = 24;
}
public SamplePoint(int p1, int p2, int p3)
{
x = p1;
y = p2;
z = p3;
}
public static void Main()
{
SamplePoint p1 = new SamplePoint(11, 21, 32); // OK
Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
SamplePoint p2 = new SamplePoint();
p2.x = 55; // OK
Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
}
/*
Output:
p1: x=11, y=21, z=32
p2: x=55, y=25, z=24
*/
}
위 예제에서 다음 예제와 같은 명령문을 사용하는 경우
p2.y = 66; // Error
읽기 전용 필드에는 할당할 수 없다. 단 생성자 또는 변수 이니셜라이저에서는 예외다.
참조 읽기 전용 반환 예
ref return의 readonly 한정자는 반환된 참조를 수정할 수 없음을 나타낸다.
private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;
반환된 유형은 readonly struct일 필요는 없다. ref readonly를 통해 ref에서 반환될 수 있는 모든 형식을 반환할 수 있다.
참고 : https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/readonly
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 구조체 (struct) 클래스 (class) 차이 (0) | 2022.07.26 |
---|---|
C# 클래스 타입 업/다운 캐스팅 (Up-DownCasting) (0) | 2022.07.22 |
C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed) (0) | 2022.07.21 |
C# 중첩 클래스 (Nested Class) (0) | 2022.07.20 |
C# 부분 클래스 (partial) (0) | 2022.07.19 |