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

7.2.1Время привязки

Статическая привязка выполняется во время компиляции, а динамическая – в процессе выполнения. В следующих разделах термин время привязки относится как ко времени компиляции, так и ко времени выполнения в зависимости от того, когда выполняется привязка.

Следующий пример иллюстрирует уведомления статической и динамической привязок, а также время привязки.

object o = 5; dynamic d = 5;

Console.WriteLine(5); // static binding to Console.WriteLine(int) Console.WriteLine(o); // static binding to Console.WriteLine(object) Console.WriteLine(d); // dynamic binding to Console.WriteLine(int)

Два первых вызова являются статическими: перегрузка Console.WriteLine выбрана на основе типа времени компиляции аргумента. Таким образом, время привязки здесь – время компиляции.

Третий вызов является динамическим: перегрузка Console.WriteLine выбрана на основе типа времени выполнения аргумента. Это происходит по причине того, что аргумент является динамическим выражением – его тип времени компиляции – dynamic. Таким образом, время привязки третьего вызова – время выполнения.

7.2.2Динамическая привязка

Назначение динамической привязки – позволить программам C# взаимодействовать с динамическими объектами, т. е. объектами, которые не подчиняются обычным правилам системы типов C#. Динамическими могут быть объекты других языков программирования с другими системами типов или объекты, которые запрограммированы на реализацию собственной семантики привязки для различных операций.

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

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

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

7.2.3Типы составных выражений

Если операция имеет статическую привязку, тип составного выражения (например, получатель, аргумент and, индекс или операнд) всегда считается типом времени компиляции данного выражения.

Если операция имеет динамическую привязку, тип составного выражения определяется по-разному в зависимости от типа времени компиляции составного выражения:

  • составное выражение типа времени компиляции должно иметь тип фактического значения, которое выражение получает во время выполнения;

  • составное выражение, чей тип времени компиляции является параметром типа, должно иметь тип, к которому параметр типа привязан во время выполнения;

  • в противном случае составное выражение должно иметь свой тип времени компиляции.

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