>>105711198The list is long, so I'll try to highlight only the things where I thought "I wish I could've done this in C# instead"
- properties as a language feature (no getProperty, setProperty spam anymore)
- extension methods, basically syntax sugar that allows you to call static methods by chaining (instead of Utils.MyCustomMethod(myObject, randomParam) you can call myObject.MyCustomMethod(randomParam), and you can define these as generic, or for interfaces, so instantly extend functionality of a lot of classes, it's what powers LiNQ, it's hard for me to describe just how powerful extension methods are
- LiNQ - like Java Streams, but more intuitive and very easily extensible
- structs - value types that actually live on the stack, very useful for native interop, but also for performance in general
- Generics support value types - Java generics only support objects, so when using a generic type with value types, they have to be cast into classes (simple int into Integer class, but hey, at least values -127 to 128 are cached, lmao). C# actually reifies generic methods/types, so the code can work with value types and structs with 0 allocations
- single build system that just works - no maven, no gradle, no configuration bs, it's much easier to configure everything
- the CLI - the dotnet cli is also pretty good, although I mainly work with C# through an IDE (use Rider if you need a crossplatform IDE)