Sure you can, it’s the same in C# as it would be in C++ if you did a=b, where a and b are both pointers.
You don’t want to copy the full data of a class around every time you use it, that would have extremely poor performance. If you do want that behaviour, use structs instead of classes. If you need to clone a class for whatever reason, you can do that too, but it’s not really something that you should need to do all that often.
I don’t think you should really jump in and call something crappy if you just don’t really know how to use it, personally!
Just for context, I’m an experienced software engineer with years of experience with both C++ and C#, as well as several others, including Rust. You can do shallow and deep copies in C# as well, it’s done extremely infrequently because it’s usually a bit of a code smell and it has some downsides - it’s inefficient both for performance and for memory.
In C# the assignment operator will copy the value if it’s a value type (structs and primitives) and copy the reference if it’s a reference type (classes). It does that because it’s a garbage collected language and it needs to track how memory is referenced and so on.
The whole debate about what languages are better is honestly a bit silly, IMO. C, C++, Python, C#, Javascript, Rust, they all serve their purpose, they have their strengths and weaknesses.