필드는클래스 또는 구조체에서 직접 선언되는 모든 형식의 변수입니다. 필드는 그것이 포함된 형식의 멤버입니다.
클래스 또는 구조체에는 인스턴스 필드, 정적 필드 또는 둘 다 있을 수 있습니다. 인스턴스 필드는 형식의 인스턴스와 관련이 있습니다. 인스턴스 필드T
가 있는 클래스F
가 있는 경우 형식T
의 두 개체를 만들고 다른 개체의 값에 영향을 주지 않고 각 개체의 F
값을 수정할 수 있습니다. 반면 정적 필드는 형식 자체에 속하며 해당 형식의 모든 인스턴스 간에 공유됩니다. 형식 이름을 사용해야만 정적 필드에 액세스할 수 있습니다. 인스턴스 이름으로 정적 필드에 액세스하면 CS0176 컴파일 시간 오류가 발생합니다.
일반적으로 필드의 접근성을 private
또는 protected
로 선언해야 합니다. 형식이 클라이언트 코드에 노출하는 데이터는 메서드, 속성 및 인덱서를 통해 제공해야 합니다. 내부 필드에 대한 간접 액세스를 위해 이러한 구문을 사용하면 잘못된 입력 값을 방지할 수 있습니다. 공용 속성에 의해 노출되는 데이터를 저장하는 프라이빗 필드를 백업 저장소 또는 백업 필드라고 합니다. 필드를 선언 public
할 수 있지만 형식을 사용하는 코드가 해당 필드를 잘못된 값으로 설정하거나 개체의 데이터를 변경하는 것을 방지할 수 없습니다.
필드는 일반적으로 둘 이상의 형식 메서드에 액세스할 수 있어야 하며 단일 메서드의 수명보다 더 오래 저장해야 하는 데이터를 저장합니다. 예를 들어 달력 날짜를 나타내는 형식에는 3개의 정수 필드가 있을 수 있습니다. 하나는 월, 1일, 연도에 대한 필드입니다. 단일 메서드의 범위 외부에서 사용되지 않는 변수는 메서드 본문 자체 내에서 지역 변수 로 선언되어야 합니다.
필드가 클래스 또는 구조체 블록에서 액세스 수준을 지정하고 그 뒤에 형식을 지정한 다음 필드 이름을 지정하여 선언됩니다. 다음은 그 예입니다.
public class CalendarEntry
{
// private field (Located near wrapping "Date" property).
private DateTime _date;
// Public property exposes _date field safely.
public DateTime Date
{
get
{
return _date;
}
set
{
// Set some reasonable boundaries for likely birth dates.
if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
{
_date = value;
}
else
{
throw new ArgumentOutOfRangeException("Date");
}
}
}
// public field (Generally not recommended).
public string? Day;
// Public method also exposes _date field safely.
// Example call: birthday.SetDate("1975, 6, 30");
public void SetDate(string dateString)
{
DateTime dt = Convert.ToDateTime(dateString);
// Set some reasonable boundaries for likely birth dates.
if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
{
_date = dt;
}
else
{
throw new ArgumentOutOfRangeException("dateString");
}
}
public TimeSpan GetTimeSpan(string dateString)
{
DateTime dt = Convert.ToDateTime(dateString);
if (dt.Ticks < _date.Ticks)
{
return _date - dt;
}
else
{
throw new ArgumentOutOfRangeException("dateString");
}
}
}
인스턴스의 필드에 액세스하려면 인스턴스 이름 뒤에 마침표와 필드 이름을 추가 instancename._fieldName
합니다. 다음은 그 예입니다.
CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";
필드가 선언될 때 대입 연산자를 사용하여 필드를 초기 값으로 지정할 수 있습니다. 자동으로 Day
필드를 "Monday"
에 할당하려면, 예를 들어 다음 예제와 같이 Day
를 선언하세요.
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
필드는 개체 인스턴스의 생성자가 호출되기 직전에 초기화됩니다. 생성자가 필드 값을 할당하는 경우 필드 선언 중에 지정된 값을 덮어씁니다. 자세한 내용은 생성자 사용을 참조하세요.
비고
필드 이니셜라이저는 다른 인스턴스 필드를 참조할 수 없습니다.
필드는 public
, private
, protected
, internal
, protected internal
또는 private protected
로 표시될 수 있습니다. 이러한 액세스 한정자는 형식의 사용자가 필드에 액세스할 수 있는 방법을 정의합니다. 자세한 내용은 액세스 한정자를 참조하세요.
필요에 따라 필드를 선언 static
할 수 있습니다. 정적 필드는 형식의 인스턴스가 없더라도 언제든지 호출자가 사용할 수 있습니다. 자세한 내용은 static 클래스 및 static 클래스 멤버를 참조하세요.
필드를 선언 readonly
할 수 있습니다. 읽기 전용 필드는 초기화 중이나 생성자에서만 값을 할당할 수 있습니다.
static readonly
필드는 C# 컴파일러가 런타임에만 컴파일 시간에 정적 읽기 전용 필드의 값에 액세스할 수 없다는 점을 제외하고 상수와 유사합니다. 자세한 내용은 상수를 참조하세요.
필드를 선언 required
할 수 있습니다. 필수 필드는 생성자 또는 개체를 만들 때 개체 이니셜라이저에 의해 초기화되어야 합니다. 모든 필수 멤버를 초기화하는 모든 생성자 선언에 특성을 추가 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 합니다.
required
수정자는 동일한 필드에서 readonly
수정자와 결합할 수 없습니다. 그러나 속성은 오직 required
와 init
만 될 수 있습니다.
C# 12부터 기본 생성자 매개 변수는 필드를 선언하는 대안입니다. 형식에 초기화 시 제공해야 하는 종속성이 있는 경우 해당 종속성을 제공하는 기본 생성자를 만들 수 있습니다. 이러한 매개 변수는 형식에서 선언된 필드 대신 캡처되고 사용될 수 있습니다. 형식의 record
경우 기본 생성자 매개 변수는 public 속성으로 표시됩니다.
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.
참고하십시오
.NET