Поля (Руководство по программированию в C#)
Поле является переменной любого типа, которая объявлена непосредственно в классе или структуре. Поля являются членами содержащих их типов.
Класс или структура может иметь поля экземпляра и (или) статические поля. Поля экземпляра относятся только к экземпляру типа. Если у вас есть класс T
с полем F
экземпляра, можно создать два объекта типа T
и изменить значение каждого объекта, не влияя на значение F
в другом объекте. Напротив, статическое поле принадлежит самому типу и является общим для всех экземпляров этого типа. Доступ к статическому полю можно получить только с помощью имени типа. Если вы обращаетесь к статическому полю по имени экземпляра, вы получите ошибки времени компиляции CS0176.
Как правило, следует объявить private
или protected
специальные возможности для полей. Данные, которые тип представляет клиентскому коду, должны предоставляться через методы, свойства и индексаторы. Используя эти конструкции для косвенного доступа к внутренним полям, можно предотвратить использование недопустимых входных значений. Закрытое поле, которое хранит данные, представленные открытым свойством, называется резервным хранилищем или резервным полем. Вы можете объявить public
поля, но затем нельзя запретить коду, использующего тип, задать это поле в недопустимое значение или изменить данные объекта.
Как правило, поля хранят данные, которые должны быть доступны нескольким методам типа и храниться дольше, чем время существования любого отдельного метода. Например, тип, представляющий календарную дату, может иметь три целочисленных поля: одно для месяца, одно для числа и одно для года. Переменные, которые не используются вне область одного метода, должны быть объявлены как локальные переменные в самом теле метода.
Поля объявляются в блоке класса или структуры, указав уровень доступа, за которым следует тип, а затем имя поля. Например:
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
, protected internal
internal
или private protected
. Эти модификаторы доступа определяют, каким образом пользователи типа смогут получать доступ к полю. Дополнительные сведения см. в статье Модификаторы доступа.
Поле можно объявить static
необязательно. Статические поля доступны вызывающим в любое время, даже если экземпляр типа не существует. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Поле можно объявить readonly
. Полю только для чтения можно присвоить значение только во время инициализации или в конструкторе. static readonly
Поле похоже на константу, за исключением того, что компилятор C# не имеет доступа к значению статического поля только для чтения во время компиляции, только во время выполнения. Дополнительные сведения см. в разделе Константы.
Поле можно объявить required
. Обязательное поле должно быть инициализировано конструктором или инициализаторами объектов при создании объекта. Атрибут добавляется в System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute любое объявление конструктора, которое инициализирует все необходимые элементы.
required
Модификатор не может сочетаться с модификатором readonly
в том же поле. Однако свойство может быть required
и init
только.
Начиная с C# 12, параметры первичного конструктора являются альтернативой объявлению полей. Если тип имеет зависимости, которые должны быть предоставлены при инициализации, можно создать первичный конструктор, предоставляющий эти зависимости. Эти параметры могут быть записаны и использованы вместо объявленных полей в типах. В случае типов параметры первичного конструктора record
отображаются как общедоступные свойства.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.