Вычисление асинхронной функции, возвращающей задачу

Вызов асинхронной функции, возвращающей задачу, приводит к созданию экземпляра типа возвращаемой задачи. Этот экземпляр называется возвращаемой задачей асинхронной функции. Сначала задача находится в состоянии incomplete.

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

После прекращения выполнения тела асинхронной функции возвращаемая задача переходит в состояние incomplete:

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

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

Вычисление асинхронной функции, возвращающей значение void

Если асинхронная функция имеет тип возвращаемого значения void, процесс вычисления отличается от описанного выше следующим образом. Поскольку задача не возвращается, функция сообщает о завершении и исключениях в контекст синхронизации текущего потока. Точное определение контекста синхронизации зависит от конкретной реализации, но этот контекст представляет "место", в котором выполняется поток. Контекст синхронизации получает уведомления при начале вычисления асинхронной функции, возвращающей значение void, при его успешном завершении, а также при возникновении неперехваченных исключений.

Это позволяет контексту синхронизации отслеживать количество выполняемых в нем асинхронных функций, возвращающих значение void, и принимать решения относительно обработки получаемых от этих функций исключений.

Структуры

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

Структуры особенно удобны для работы с небольшим объемом данных, имеющих семантику значения. Примерами структур являются комплексные числа, точки в системе координат или словарные пары «ключ-значение». Ключевой особенностью таких структур данных является наличие нескольких переменных-членов, для которых не требуется использовать наследование или идентификацию на уровне ссылок и которые удобно реализовывать с использованием семантики значения, когда при присваивании копируется значение, а не ссылка.

Как описано в §4.1.4, доступные в C# простые типы, такие как int, double и bool, фактически являются структурами. Благодаря тому, что эти предопределенные типы являются структурами, в языке C# можно реализовывать новые «простые» типы при помощи переопределения структур и операторов. В конце этой главы приводится два примера таких типов (§11.4).

Объявления структур

Объявление структуры является объявлением типа (§9.6), в котором объявляется новая структура:

struct-declaration:
attributesopt struct-modifiersopt partialopt struct identifier type-parameter-listopt
struct-interfacesopt type-parameter-constraints-clausesopt struct-body ;opt

Объявление структуры состоит из необязательного набора атрибутов (§17), за которым следует необязательный набор модификаторов структуры (§11.1.1), необязательный модификатор partial, ключевое слово struct, идентификатор, который указывает имя структуры, необязательная спецификация списка параметров типа (§10.1.3), необязательная спецификация интерфейсов структуры (§11.1.2) ), необязательная спецификация конструкций ограничений для параметров типа (§10.1.5), тело структуры (§11.1.4) и точка с запятой (необязательно).

Модификаторы структуры

Объявление структуры может включать последовательность модификаторов структуры:

struct-modifiers:
struct-modifier
struct-modifiers struct-modifier

struct-modifier:
new
public
protected
internal
private

Включение одного модификатора в объявление структуры несколько раз приведет к возникновению ошибки времени выполнения.

Модификаторы объявления структуры имеют такое же действие, как модификаторы объявления класса (§10.1).

Модификатор partial

Модификатор partial указывает, что объявление структуры является объявлением частичного типа. Несколько частичных объявлений структуры с одним именем в едином пространстве имен или объявлении типа объединяются в одно объявление структуры с соблюдением правил, указанных в §10.2.

Интерфейсы структуры

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

struct-interfaces:
: interface-type-list

Реализация интерфейсов рассматривается более подробно в §13.4.

Тело структуры

Тело структуры определяет членов структуры.

struct-body:
{ struct-member-declarationsopt }

Члены структуры

К членам структуры относятся члены, включенные в объявления членов структуры и члены, унаследованные из System.ValueType.

struct-member-declarations:
struct-member-declaration
struct-member-declarations struct-member-declaration

struct-member-declaration:
constant-declaration
field-declaration
method-declaration
property-declaration
event-declaration
indexer-declaration
operator-declaration
constructor-declaration
static-constructor-declaration
type-declaration

За исключением различий, рассмотренных в §11.3, описания членов класса, содержащиеся в §10.3–§10.14, справедливы и для членов структуры.

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