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