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

7.1.1Значения выражений

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

  • Значение переменной — это просто значение, которое хранится в данный момент в расположении, указанном переменной. Для получения значения переменной оно должно быть явно присвоено (§5.3), в противном случае возникает ошибка времени компиляции.

  • Значение выражения доступа к свойству получается путем вызова метода_доступа_get для свойства. Если у свойства нет метода_доступа_get, возникает ошибка времени компиляции. В противном случае выполняется вызов функции-члена (§7.5.4), и значением выражения доступа к свойству становится результат этого вызова.

  • Значение выражения доступа к индексатору получается путем вызова метода_доступа_get для индексатора. Если у индексатора нет метода_доступа_get, возникает ошибка времени компиляции. В противном случае выполняется вызов функции-члена (§REF) со списком аргументов, связанных с выражением доступа к индексатору, и значением выражения доступа к индексатору становится результат этого вызова.

7.2Статическая и динамическая привязка

Процесс определения значения операции на основе типа или значения составляющих выражений (аргументы, операнды, выражения-получатели) часто называют привязкой. Например, значение вывода метода определяется на основе типа выражения-получателя или аргументов. Значение оператора определяется на основе типа его операндов.

В C# значения операции обычно определяется во время компиляции на основе типа времени компиляции его составляющих выражений. Также, если выражение содержит ошибку, она определяется и объявляется компилятором. Подобный метод называется статической привязкой.

Однако если выражение является динамическим (т. е. имеет тип dynamic), это указывает на то, что любая участвующая привязка должна быть основана на типе времени выполнения (т. е. типе фактический объекта, означаемого временем выполнения), а не на типе, который она имела во время компиляции. Привязка такой операции откладывается до времени выполнения операции при работающей программе. Это называется динамической привязкой.

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

В C# имеются следующие операции привязки:

  • доступ к члену e.M;

  • вызов метода e.M(e1,…,en);

  • вызов делегата e(e1,…,en);

  • доступ к элементу e[e1,…,en];

  • создание объекта new C(e1,…,en);

  • перегруженные унарные операторы +, -, !, ~, ++, --, true, false;

  • перегруженные бинарные операторы +, -, *, /, %, &, &&, |, ||, ??, ^, <<, >>, ==,!=, >, <, >=, <=;

  • операторы присваивания =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=;

  • явные и неявные преобразования.

Если динамические выражения не включены, C# устанавливает статическую привязку, т. е. типы времени компиляции составляющих выражений используются в процессе выбора. Однако если одно из составляющих выражений в операциях, перечисленных выше, является динамическим выражением, операция привязывается динамически.

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