Task — heap-allocated. ValueTask — stack or heap.
Task:
ValueTask:
1// Task2public async Task<int> GetValueAsync()3{4 return await ComputeAsync();5}67// ValueTask8public ValueTask<int> GetValueAsync()9{10 if (_cached)11 return new ValueTask<int>(_value);12 return new ValueTask<int>(ComputeAsync());13}
Key: Task for general, ValueTask for hot paths.