Поля (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

Переменная field имеет любой тип, непосредственно объявленный в классе или структуре. Поля являются членами содержащихся в них типов.

Класс или структура могут иметь поля экземпляра или статические поля, либо поля обоих типов. Поля экземпляра определяются экземпляром типа. Если имеется класс T и поле экземпляра F, можно создать два объекта типа T и изменить значение поля F в каждом объекте, не изменяя значение в другом объекте. В противоположность этому, статическое поле относится к самому классу, и является общим для всех экземпляров этого класса. Изменения, выполненные из экземпляра А, будут немедленно видны экземплярам В и С, если они обращаются к полю.

Как правило, используются поля только для переменных, имеющих доступность private или protected. Данные, которые класс представляют клиентскому коду, должны обеспечиваться методами, свойствами и индексаторами. Используя эти конструкции для косвенного доступа к внутренним полям, можно защититься от недопустимых входных значений. Закрытое поле, которое хранит данные, представленные открытым свойством, называется резервным хранилищем или резервным полем.

Поля обычно хранят данные, которые должны быть доступными нескольким методам класса и должны храниться дольше, чем время существования любого отдельного метода. Например, в классе, представляющем календарную дату, может быть три целочисленных поля: одно для месяца, одно для числа, одно для года. Переменные, не используемые вне области одного метода, должны быть объявлены как локальные переменные внутри самого тела метода.

Поля объявляются в блоке класса путем указания уровня доступа поля, за которым следует тип поля и имя поля. Пример.

public class CalendarEntry
{
    // private field
    private DateTime date;

    // public field (Generally not recommended)
    public string day;

    // Public property exposes date field safely.
    public DateTime Date 
    {
        get 
        {
            return date;
        }
        set 
        {
            if(value.Year > 1980 || value.Year <= 2008)
            {
                date = value;
            }
            else
                throw new ArgumentOutOfRangeException();
        }

    }

    // Public method also exposes date field safely.
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Year > 1980 || dt.Year <= 2008)
        {
            date = dt;
        }
        else
            throw new ArgumentOutOfRangeException();            
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt != null && dt.Ticks < date.Ticks)
        {
            return date - dt;
        }
        else
            throw new ArgumentOutOfRangeException();  

    }
}

Для доступа к члену объекта нужно добавить точку после имени объекта и указать имя поля: objectname.fieldname. Пример.

CalendarEntry birthday = new CalendarEntry();
birthday.day = "Saturday";

Полю можно назначить первоначальное значение, используя оператор присвоения при объявлении поля. Например, чтобы автоматически присвоить полю day значение "Monday", можно объявить поле day как указано в следующем примере:

public class CalendarDateWithInitialization
{
    public string day = "Monday";
    //...
}

Поля инициализируются непосредственно перед вызовом конструктора для экземпляра объекта. Если конструктор присваивает полю значение, оно заменит значения, присвоенные при объявлении поля. Дополнительные сведения см. в разделе Использование конструкторов (руководство по программированию в C#).

ms173118.alert_note(ru-ru,VS.90).gifПримечание.

Инициализатор поля не может ссылаться на другие поля экземпляров.

Поля могут быть отмечены модификаторами public, private, protected, internal или protected internal. Эти модификаторы доступа определяют порядок доступа к полю для пользователей класса. Дополнительные сведения см. в разделе Модификаторы доступа (Руководство по программированию в C#).

Также при необходимости поле может быть объявлено с модификатором static. При этом поле становится доступным для вызова в любое время, даже экземпляр класса отсутствует. Дополнительные сведения см. в разделе Статические классы и члены статических классов (руководство по программированию в C#).

Также при необходимости поле может быть объявлено с модификатором readonly. Полю с этим модификатором (то есть полю, доступному только для чтения) значения могут быть присвоены только при инициализации или в конструкторе. Поле с модификаторами staticreadonly (статическое, доступное только для чтения) очень похоже на константу, за исключением того, что компилятор C# не имеет доступа к значению такого поля при компиляции: доступ возможен только во время выполнения. Дополнительные сведения см. в разделе Константы (руководство по программированию на C#).

Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 1.6.5 Поля

  • 10.5 Поля

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Использование конструкторов (руководство по программированию в C#)

Наследование (Руководство по программированию в C#)

Модификаторы доступа (Руководство по программированию в C#)

Абстрактные и запечатанные классы и члены классов (руководство по программированию в C#)