Yeah, which is the problem with GC'd languages because it isn't always obvious where allocation will occur.
D also has something similar as compiler switch.
That being said, it is still doable to avoid allocations and the standard library has become much better with not allocating unless really necessary. A lot of the newer things with Span<T> enable zero-allocation usage of certain APIs that before would have allocated.
This requires some care though, as the struct may still be copied needlessly if it is not also marked as `readonly` [2].
[1] - https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-serie... [2] - https://docs.microsoft.com/en-us/dotnet/csharp/write-safe-ef...