Another benefit of C# is that they continually add features to make the language less susceptible to GC stalls. Compared to Java you have Value types, real generics, ref and out arguments, Span<T> types, stackalloc allocations, unsafe blocks and so on. You can get quite far without allocating anything on the heap and the ergonomics won't be that much worse than even C++ when doing so.
It also had quite a rich unsafe API since .NET Framework days which has since then been complimented by safer alternatives which offer similar or better performance namely Span<T>s and then lately struct optimizations which are helped by the fact that C# generics with struct arguments == Rust generics with struct arguments (aka the ones which are not Box<dyn Trait>).
https://learn.microsoft.com/en-us/dotnet/csharp/language-ref...