Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.5Поля

Поле – это член, представляющий переменную, связанную с объектом или классом. Объявление_поля вводит одно или более полей заданного типа.

объявление_поля: атрибутынеоб модификаторы_полянеоб тип деклараторы_переменных ;

модификаторы_поля: модификатор_поля модификаторы_поля модификатор_поля

модификатор_поля: new public protected internal private static readonly volatile

деклараторы_переменных: декларатор_переменной деклараторы_переменных , декларатор_переменной

декларатор_переменной: идентификатор идентификатор = инициализатор_переменной

инициализатор_переменных: выражение инициализатор_массива

Объявление_поля может включать набор атрибутов (§17), модификатор new (§10.3.4), допустимое сочетание из четырех модификаторов доступа (§10.3.5) и модификатор static (§10.5.1). Кроме того, объявление_поля может включать модификатор readonly (§10.5.2) или volatile (§10.5.3), но не оба. Атрибуты и модификаторы применяются ко всем членам, объявленным объявлением_поля. Неоднократное появление одного и того же модификатора в объявлении поля является ошибкой.

Тип в объявлении_поля указывает тип членов, вводимых объявлением. За типом следует список деклараторов_переменных, каждый из которых вводит новый член. Декларатор_переменной состоит из идентификатора, именующего член, за которым необязательно следуют лексема «=» и инициализатор_переменной (§10.5.5), задающий начальное значение члена.

Тип поля должен быть, по крайней мере, таким же доступным, как само поле (§3.5.4).

Значение поля получается в выражении с помощью простого_имени (§7.6.2) или доступа_к_члену (§7.6.4). Значение поля с доступом не только для чтения изменяется с помощью присваивания (§7.17). Значение поля с доступом не только для чтения можно и получать, и изменять с помощью операторов постфиксного увеличения и уменьшения (§7.6.9) и операторов префиксного увеличения и уменьшения (§7.7.5).

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

class A { public static int X = 1, Y, Z = 100; }

эквивалентно

class A { public static int X = 1; public static int Y; public static int Z = 100; }

10.5.1Статические поля и поля экземпляров

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

Статическое поле не является частью конкретного экземпляра, а используется совместно всеми экземплярами закрытого типа (§4.4.2). Независимо от того, сколько создано экземпляров закрытого типа класса, всегда существует только одна копия статического поля для соответствующей области приложения.

Пример.

class C<V> { static int count = 0;

public C() { count++; }

public static int Count { get { return count; } } }

class Application { static void Main() { C<int> x1 = new C<int>(); Console.WriteLine(C<int>.Count); // Prints 1

C<double> x2 = new C<double>(); Console.WriteLine(C<int>.Count); // Prints 1

C<int> x3 = new C<int>(); Console.WriteLine(C<int>.Count); // Prints 2 } }

Поле экземпляра принадлежит экземпляру. В частности, каждый экземпляр класса содержит отдельный набор всех полей экземпляров этого класса.

Если к полю производится обращение через доступ_к_члену (§7.6.4) вида E.M, если M является статическим полем, E должно означать тип, содержащий M, а если M является полем экземпляра, E должно означать экземпляр типа, содержащего M.

Различия между статическими членами и членами экземпляров рассматриваются в разделе §10.3.7.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]