Статическая и динамическая привязка — КиберПедия 

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

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

2017-10-16 360
Статическая и динамическая привязка 0.00 из 5.00 0 оценок
Заказать работу

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

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

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

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

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

· Доступ к члену: e.M

· Вызов метода: e.M(e1,…,en)

· Вызов делегата: e(e1,…,en)

· Доступ к элементу: e[e1,…,en]

· Создание объектов: new C(e1,…,en)

· Перегруженные унарные операторы: +, -,!, ~, ++, --, true, false

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

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

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

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

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

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

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

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. Таким образом, время привязки третьего вызова — время выполнения.

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

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

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

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

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

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

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

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

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

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

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

Операторы

Выражения состоят из операндов и операторов. Операторы в выражении указывают, какие операции производятся с операндами. К операторам относятся, например, +, -, *, / и new. К операндам относятся, например, литералы, поля, локальные переменные и выражения.

Существует три типа операторов.

· Унарные операторы. У унарного оператора есть только один операнд и оператор может записываться в префиксной форме (например, –x) или постфиксной форме (например, x++).

· Бинарные операторы. У бинарных операторов два операнда и они записываются в виде инфикса (например, x + y).

· Тернарный оператор. Существует только один тернарный оператор,?:. В нем три операнда и используется инфиксная запись (c? x: y).

Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов (§7.3.1).

Операнды в выражении вычисляются слева направо. Например, в выражении F(i) + G(i++) * H(i) вызывается метод F со старым значением i, затем вызывается метод G со старым значением i и, наконец, вызывается метод H с новым значением i. Это никак не связано с приоритетом операторов.

Некоторые операторы допускают перегрузку. Перегрузка операторов позволяет использовать пользовательскую реализацию операторов в операциях, в которых один или оба операнда имеют пользовательский тип класса или структуры (§7.3.2).


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.