In C++ you have the choice, the compiler makes the shallow copy (you know what that is right?) automatically if needed, or you can move around the pointer or a ref. Or, transform the shallow copy into a deep copy if you need that.
In c# you don’t even not have the choice, ints etc gets copied but classes aren’t. Where’s the logic behind that?
And as so many others you scramble to find some excuse that “you should probably not do that very often anyways” or some other bullshit.
I heard all that 20 years ago when it actually had some merit for people trying to run it on the old crappy hardware of the day, today it’s just moot.
Need speed or low memory usage? Learn to code in C/C++ for example. Heard Rust is great too.
C# is just an old wonky language.
/Rant off
Well yes, except when you allocate stuff in the constructor.