필드
필드는 C++의 데이터 멤버를 의미하며 C++의 그 것과 별 차이가 없다. 단, 앞에서 언급한 것처럼 C#에서의 기본 재사용 단위가 어셈블리이기 때문에 접근 한정자에 internal이 더 추가되었다. 필드들은 명시적으로 초기화를 하지 않을 경우, 수치형은 0으로, 불린형은 false, 참조형은 null로 초기화 된다.
C#에서도 C++의 정적 멤버에 해당하는 정적 필드를 제공한다. 단순히 필드 선언 앞에 static 한정자를 추가로 선언하여 주면 된다. 정적 필드는 특정 객체 (인스턴스)와 관련이 없고 클래스 자체와 관련이 있다. 즉, 객체 마다 정적 필드가 할당되는 것이 아니라 클래스 당 하나만 할당이 된다. 따라서, 객체의 개수를 카운트하거나 통계 값들을 저장할 경우 유용하게 사용할 수 있다. C++에서는 일반 필드를 참조하듯이, 즉 인스턴스를 통하여 정적 필드를 참조할 수도 있었으나 C#에서는 반드시 클래스명.정적필드명 형태로만 참조할 수 있다.
C#에는 C++에 없는 읽기 전용 필드를 제공한다. 필드 선언 시에 추가로 readonly를 덧 붙여주면 된다. 읽기 전용 필드는 객체 생성 시에 지정된 값을 변경할 수 없게 해준다. 따라서 readonly로 선언된 필드의 값은 선언 시에 초기값을 확정하든 아니면 생성자 부분에서 값을 확정할 수 있다. 아래의 예제 코드에서 보듯이 읽기 전용 필드는 선언 시에도 초기화를 할 수 있고 이를 생성자 부분에서 다시 초기화 할 수도 있다.
using System;
public class Sample
{
class ReadOnlyClass
{
public int x;
public readonly int y = 1;
public readonly int z;
public ReadOnlyClass()
{
z = 24;
}
public ReadOnlyClass(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
static void Main()
{
ReadOnlyClass o1 = new ReadOnlyClass(1, 2, 3);
Console.WriteLine("o1: x={0}, y={1}, z={2}", o1.x, o1.y, o1.z);
ReadOnlyClass o2 = new ReadOnlyClass();
o2.x = 55; // OK
o2.y = 6; // 오류
o2.z = 7; // 오류
}
}
참고로, 읽기 전용 필드는 뒤에 나오는 상수 필드와 다르다. 상수 필드는 필드를 선언할 때만 초기화될 수 있는 반면 읽기 전용 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있다. 따라서 읽기전용 필드의 값은 사용된 생성자에 따라 다르며 또한 상수 필드는 컴파일 타임 상수인 반면 읽기전용 필드는 런타임 상수로도 사용할 수 있습니다(예: public static readonly uint l1 = (uint) DateTime.Now.Ticks;).