I always enjoyed coding in c++. But coding in C# makes coding in c++ feel like coding in assembly. Here’s 9 reasons why I love it.
It’s not until you stop using headers until you realise how stupidly archaic they are.
Using var means you don’t have to actually declare the type. The compiler can work that shit out for itself! This is one of those things that you don’t appreciate when you hear about it.. but when you start using it you really do.
int myvariable = GetHealth();
var myvariable = GetHealth();
You can still use int in the c# version if you like, and I’m sure there’s purists that say that you shouldn’t even use var for some reason.
I haven’t even scratched the surface of knowing what Linq is all about.. but I know this is cool. Imagine you need to find a player by playerID in a list of players. I appreciate that you’d have probably wrapped all your ugly c++ with macro’s or you’ll be using some super complicated Boost library in c++.. but for arguments sake
MyPlayer player = null;
for (std::list::const_iterator it = playerList.begin(), end = playerList.end(); it!= end; ++it )
if ( (*iterator)->PlayerID == FindID )
player = *iterator;
var player = PlayerList.Find( x => x.PlayerID == FindID );
Yep that’s right. It’s like writing an inline function. It feels like cheating.
var notPlayers = PlayerList.FindAll( x => x.PlayerID != FindID );
var banPlayer = PlayerList.Find( x => x.Username!= BanName );
If you’ve ever written a class factory in C++ you will appreciate attributes. So you make this function..
public class ConVar: Attribute
public string help = "";
public ConVar( string help )
this.help = help;
Now in any class in your code you can do this..
[ConVar( "Start health of player" )]
static public float health = 4.5f;
[ConVar( "Player's name" )]
static public string name = "Unnammed";
Now on startup you can make your program find every ConVar attribute and set them up in a dictionary by field name. Then you can add functions to get and change their values. You just made a convar system.
It’s kind of an excited feature once you start digging into it, there are tons of possible uses.
No Macros, templates
Like headers, a lot of c#’s strengths come from the things it doesn’t provide. It’s simple and easy. It doesn’t encourage you to change the language. Sometimes coding in c++ is like writing your own language for things and fooling the compiler into working for you.
You ever had a function with tons of arguments, or even worse – a ton of optional arguments?
int MyFunction( string shirt = "", string shoes = "", int numEyes = 2, float time = 5.0f )
// Do Something
MyFunction( shoes: "Trainers" );
MyFunction( time : 2.0f, shirt: "white" );
It’s another one of those things that seems useless, but is really nice.
In C++ you can kind of make an interface but it’s never really proper. With Interface and Abtsract classes in c# you know exactly where you are.
Converting c++ code to work in 64bit is a bit of a mine field. You might get it compiling.. but you never really know whether your code is actually going to be doing bad things unless you have either designed it from scratch for 64bit, or you have gone line by line and verified.
In C# chances are your code is going to just work. Unless you’re doing some really really specific things. To me this sums up C#. It shows how abandoned and old fashioned c++ is.
Thanks to Mono all this stuff isn’t bound to Windows. It kind of makes your investment in learning c# less useless.
C++ is never going to go away. It’s probably always going to be the bedrock of everything. But maybe it’s time to re-evaluate whether everything should be coded in C++ by default. Maybe it’s time to think about the future. Writing less error-prone, more future-proof code.