Sobes.tech
Back to questions
Junior — Middle
65

Как отличить Task от ValueTask и в каких случаях их рекомендуется использовать?

Answer from AI

sobes.tech AI

Task и ValueTask — это типы, используемые для асинхронного программирования в C#.

  • Task — это ссылочный тип, представляющий асинхронную операцию. Он всегда выделяется в куче и подходит для большинства случаев асинхронного кода.

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

Когда использовать:

  • Используйте Task по умолчанию — это проще и безопаснее.
  • Используйте ValueTask, если метод часто завершает работу синхронно и вы хотите избежать лишних аллокаций, например, в высокопроизводительных библиотеках.

Важно:

  • ValueTask нельзя использовать повторно — его нельзя awaitить несколько раз.
  • Если метод возвращает ValueTask, и вы хотите получить Task, можно вызвать .AsTask().

Пример:

// Метод с Task
async Task<int> GetValueAsync() {
    await Task.Delay(100);
    return 42;
}

// Метод с ValueTask
ValueTask<int> GetValueFastAsync(bool fast) {
    if (fast) return new ValueTask<int>(42); // синхронный результат
    else return new ValueTask<int>(GetValueAsync()); // асинхронный
}