When you’ve been writing software as long as I have, it’s fun to look back at how far technology has advanced throughout your career. I’ve been thinking a bit lately about C and .NET, and basically the whole Microsoft stack. This led me down the rabbit hole of reading and remembering (and sometimes finding out for the first time) how the current MS stack came to be where it is today.
So I figured I’d write a blog series about it all. Let’s have some fun.
When Java came on the programming scene in the late 90s, it immediately made a huge impact on the industry. Java quickly became the talk of the software community, and even today remains probably the most popular programming language.
This got Microsoft’s attention, and it fueled its desire to build something that you program once and run anywhere. That sort of model wouldn’t be good for Microsoft Windows.
Microsoft created their own version of Java, and after several lawsuits (1997-2001) from Sun, Microsoft walked away from the Java game.
But Microsoft didn’t want to walk away from new programming languages and more productive developers. It didn’t make a lot of sense to leave Windows to be the world of C++ while the rest of the world moved on to Java and its higher productivity levels.
They created a new language very similar to Java called C#. If you compared Java in 2002 and C# in 2002, you would find two languages that are clearly siblings. Each has its bits of uniqueness (for example, one of the big differences back in 2002 was the use of the == operator to compare strings and the handling of exceptions from methods), but they are very close in many ways.
This blog series will focus on the history as it applies to .NET, but the history of C# and .NET are not completely linked. We could have discussed these independently, but for this series we will keep them together. The other theme is the changes that most affected how the code looks over time, such as Generics, have had a huge impact on the code written, as well as WPF (XAML), at least for a while.
.NET Framework 2.0 (Generics, Partial Classes, Nullable types, Anonymous Methods)
.NET Framework 3.0/3.5 (WPF, WF, WCF, Auto-Implemented Properties)
.NET Framework 3.0 (LINQ)
.NET Framework 3.5 SP1 (ADO.NET Entity Framework)
.NET Framework 4.0 (Parallel, Dynamic)
.NET Framework 4.5 (Async)
.NET Core 2.1/2.2 (expression-bodied members, Local functions, Async Main)
.NET Core 3.0/3.1/Framework 4.7 (New Start, Performance, Switch Statements, Tuples, readonly, Using)
.NET Core 5 (Merge, Record Types, Top Level Statements)