What are the fundamental differences between:
var buffer = new byte[8192];
var bytesRead = Stream.Read(buffer, 0, buffer.Length);
var buffer = new byte[8192];
var span = new Span<byte>(buffer);
var bytesRead = Stream.Read(span);
var buffer = new byte[8192];
var memory = new Memory<byte>(buffer);
var bytesRead = Stream.ReadAsync(memory).Result;
Excluding the obvious fact that they are all different object types and that the only Stream.Read() method that accepts a Memory<Byte> is ReadAsync() of course.
Why would I pick any of byte[], Span<byte> or Memory<byte> over the others and how would I decide what is best for my situation?