Имена членов, зарезервированные для свойств

Для свойства P (§10.7) типа T зарезервированы следующие подписи:

T get_P();
void set_P(T value);

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

В этом примере

using System;

class A
{
public int P {
get { return 123; }
}
}

class B: A
{
new public int get_P() {
return 456;
}

new public void set_P(int value) {
}
}

class Test
{
static void Main() {
B b = new B();
A a = b;
Console.WriteLine(a.P);
Console.WriteLine(b.P);
Console.WriteLine(b.get_P());
}
}

класс A определяет доступное только для чтения свойство P, резервируя тем самым сигнатуры для методов get_P и set_P. Класс B является производным от A, и скрывает обе эти зарезервированные сигнатуры. Далее показан вывод для вышеуказанного примера.

123
123
456

Имена членов, зарезервированные для событий

Для события E (§10.8) типа делегата T зарезервированы следующие подписи:

void add_E(T handler);
void remove_E(T handler);

Имена членов, зарезервированные для индексаторов

Для индексатора (§10.9) типа T со списком параметров L зарезервированы следующие подписи:

T get_Item(L);
void set_Item(L, T value);

Зарезервированы обе сигнатуры, даже если индексатор доступен только для чтения или только для записи.

Кроме того, имя члена Item является зарезервированным.

Имена членов, зарезервированные для деструкторов

Для класса, содержащего деструктор (§10.13), зарезервирована следующая сигнатура:

void Finalize();

Константы

Константа – это член класса, представляющий постоянное значение: значение, которое может быть вычислено во время компиляции. Объявление константы вводит одну или более констант указанного типа.

constant-declaration:
attributesopt constant-modifiersopt const type constant-declarators ;

constant-modifiers:
constant-modifier
constant-modifiers constant-modifier

constant-modifier:
new
public
protected
internal
private

constant-declarators:
constant-declarator
constant-declarators , constant-declarator

constant-declarator:
identifier = constant-expression

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

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

Тип, указанный в объявлении константы, должен быть типом sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, перечисляемым типом или ссылочным типом. Каждое константное выражение должно давать значение конечного типа или типа, который может быть неявно преобразован к конечному типу (§6.1).

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

Значение константы получается в выражении с помощью простого имени (§7.6.2) или доступа к члену (§7.6.4).

Константа сама может участвовать в константном выражении. Таким образом, константу можно использовать в любой конструкции, где требуется константное выражение. Примеры таких конструкций включают метки case, операторы goto case, объявления членов enum, атрибуты и другие объявления констант.

Как описано в §7.19, константное выражение является выражением, которое может быть полностью вычислено во время компиляции. Поскольку единственный способ создать отличное от NULL значение ссылочного типа, отличное от string, – применить оператор new, а оператор new не допускается в константном выражении, единственным возможным значением для констант ссылочных типов, отличных от string, является null.

Если для значения константы требуется символическое имя, а тип этого значения не допускается в объявлении константы, или если значение невозможно вычислить во время компиляции посредством константного выражения, вместо этого можно использовать поле readonly (§10.5.2).

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

class A
{
public const double X = 1.0, Y = 2.0, Z = 3.0;
}

равнозначно

class A
{
public const double X = 1.0;
public const double Y = 2.0;
public const double Z = 3.0;
}

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

class A
{
public const int X = B.Z + 1;
public const int Y = 10;
}

class B
{
public const int Z = A.Y + 1;
}

компилятор сначала вычисляет A.Y, затем B.Z и наконец A.X, создавая значения 10, 11 и 12. Объявления констант могут зависеть от констант из других программ, но такие зависимости возможны только в одном направлении. В вышеприведенном примере: если бы A и B были объявлены в отдельных программах, для A.X было бы возможно зависеть от B.Z, но тогда B.Z не мог бы одновременно зависеть отA.Y.

Поля

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

field-declaration:
attributesopt field-modifiersopt type variable-declarators ;

field-modifiers:
field-modifier
field-modifiers field-modifier

field-modifier:
new
public
protected
internal
private
static
readonly
volatile

variable-declarators:
variable-declarator
variable-declarators , variable-declarator

variable-declarator:
identifier
identifier = variable-initializer

variable-initializer:
expression
array-initializer

Объявление поля может включать набор атрибутов (§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;
}

Наши рекомендации