Task — reference type. ValueTask — value type.
1// Task — always allocates2public async Task<int> GetDataAsync() {3 return await httpClient.GetIntAsync("url");4}56// ValueTask — no allocation if synchronous7public async ValueTask<int> GetDataAsync() {8 if (cache.Contains("key")) {9 return cache["key"]; // No allocation10 }11 return await httpClient.GetIntAsync("url");12}