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

Поле является переменной любого типа, которая объявлена непосредственно в классе или структуре.A field is a variable of any type that is declared directly in a class or struct. Поля являются членами содержащих их типов.Fields are members of their containing type.

Класс или структура может иметь поля экземпляра или статические поля.A class or struct may have instance fields or static fields or both. Поля экземпляра относятся только к экземпляру типа.Instance fields are specific to an instance of a type. Если имеется класс T с полем экземпляра F, можно создать два объекта типа T и изменить значение F в каждом объекте, не влияя на значение в другом объекте.If you have a class T, with an instance field F, you can create two objects of type T, and modify the value of F in each object without affecting the value in the other object. Напротив, статическое поле принадлежит к самому классу и является общим для всех экземпляров этого класса.By contrast, a static field belongs to the class itself, and is shared among all instances of that class. Изменения, выполненные из экземпляра A, будут немедленно доступны экземплярам B и C, если они получат доступ к полю.Changes made from instance A will be visibly immediately to instances B and C if they access the field.

Как правило, следует использовать поля только для переменных, являющихся закрытыми или защищенными.Generally, you should use fields only for variables that have private or protected accessibility. Данные, которые класс представляет клиентскому коду, должны предоставляться через методы, свойства и индексаторы.Data that your class exposes to client code should be provided through methods, properties and indexers. Используя эти конструкции для косвенного доступа к внутренним полям, можно предотвратить использование недопустимых входных значений.By using these constructs for indirect access to internal fields, you can guard against invalid input values. Закрытое поле, которое хранит данные, представленные открытым свойством, называется резервным хранилищем или резервным полем.A private field that stores the data exposed by a public property is called a backing store or backing field.

Как правило, поля хранят данные, которые должны быть доступны нескольким методам класса и храниться дольше, чем время существования любого отдельного метода.Fields typically store the data that must be accessible to more than one class method and must be stored for longer than the lifetime of any single method. Например, класс, представляющий календарную дату, может иметь три целочисленных поля: одно для месяца, одно для числа и одно для года.For example, a class that represents a calendar date might have three integer fields: one for the month, one for the day, and one for the year. Переменные, не используемые вне области одного метода, должны быть объявлены как локальные переменные в самом теле метода.Variables that are not used outside the scope of a single method should be declared as local variables within the method body itself.

Поля объявляются в блоке класса путем указания уровня доступа поля, за которым следует тип поля, а затем имя поля.Fields are declared in the class block by specifying the access level of the field, followed by the type of the field, followed by the name of the field. Например:For example:

   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 
           {
               // Set some reasonable boundaries for likely birth dates.
               if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
               {
                   date = value;
               }
               else
                   throw new ArgumentOutOfRangeException();
           }

       }

       // 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();
       }

       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.To access a field in an object, add a period after the object name, followed by the name of the field, as in objectname.fieldname. Например:For example:

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

Полю можно присвоить начальное значение с помощью оператора присваивания при объявлении поля.A field can be given an initial value by using the assignment operator when the field is declared. Чтобы автоматически назначить поле day, например полю "Monday", нужно объявить day, как в следующем примере:To automatically assign the day field to "Monday", for example, you would declare day as in the following example:

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

Поля инициализируются непосредственно перед вызовом конструктора для экземпляра объекта.Fields are initialized immediately before the constructor for the object instance is called. Если конструктор присваивает значение поля, он заменит значения, присвоенные при объявлении поля.If the constructor assigns the value of a field, it will overwrite any value given during field declaration. Дополнительные сведения см. в разделе Использование конструкторов.For more information, see Using Constructors.

Примечание

Инициализатор поля не может ссылаться на другие поля экземпляров.A field initializer cannot refer to other instance fields.

Поля могут иметь пометку public, private, protected, internal, protected internal или private protected.Fields can be marked as public, private, protected, internal, protected internal or private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут получать доступ к полю.These access modifiers define how users of the class can access the fields. Дополнительные сведения см. в статье Модификаторы доступа.For more information, see Access Modifiers.

При необходимости можно объявить поле статическим (static).A field can optionally be declared static. Это делает поле доступным для вызывающих объектов в любое время, даже если экземпляр класса не существует.This makes the field available to callers at any time, even if no instance of the class exists. Дополнительные сведения см. в статье Статические классы и члены статических классов.For more information, see Static Classes and Static Class Members.

Поле может быть объявлено доступным только для чтения (readonly).A field can be declared readonly. Полю только для чтения можно присвоить значение только во время инициализации или в конструкторе.A read-only field can only be assigned a value during initialization or in a constructor. Поле static readonly очень похоже на константу, за исключением того, что компилятор C# не имеет доступа к значению статического поля только для чтения во время компиляции, но только во время выполнения.A static readonly field is very similar to a constant, except that the C# compiler does not have access to the value of a static read-only field at compile time, only at run time. Дополнительные сведения см. в разделе Константы.For more information, see Constants.

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

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also