Почему структуры Awaiters (async/await), а не классы? Можно ли использовать классы?

Почему awaiters (GetAwaiter - создавать класс, ожидаемые), а не классы. Не вредит ли вам использование класса?

public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion:

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#b8626cdb2f1cbe65

public struct YieldAwaiter : ICriticalNotifyCompletion:

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/YieldAwaitable.cs#1e1219f924e9e3b7

public struct TaskAwaiter<TResult> : ICriticalNotifyCompletion

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#2c48fb3bdfc69022

Ответ 1

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

Это деталь реализации. Нет необходимости в том, чтобы быть типом struct, а не a class. Чтобы усилить это утверждение, попробуйте выполнить компиляцию async-метода в Roslyn в режиме Debug, и вы увидите, что state-machine - это класс, где-как компиляция в Release приведет к struct. Подробнее об этом в Почему в Roslyn существуют классы async state machines (а не структуры)?