C# is continuously evolving and absorbing many useful features. Some of them are syntax sugar and Visual Studio will propose a simplified code, but some of them allows what wasn’t possible before so taking advantage of new C# version requires a change of thinking about the code. The best way how to unlock new capabilities is learning of functional programming because most features are taken from F#.
The biggest technical change is Default interface members because it requires a change in .NET runtime which is what haven’t been done since the introduction of generics in .NET 2.0. It will allow to add a new member to the interface if you provide a mapping to one of existing members.
The most significant performance improvement was made by introduction of Span which is an array of pointers to another array. The string.Substring method is inefficient because it returns a copy if the original string. It is much more efficient to return a window to the original string without need to copy anything.
The most useful change for consumers is something what can reduce a chance of NullReferenceException in production code. Developer can opt-in for non-nullable reference types which means that is no longer possible to assign null into pointer (string is a pointer). Nulls will be allowed only in nullable types (like string?).
“I think I’ve often cried before. If I had to do over I would separate nullability from value versus reference representation of types such that you could have non-nullable reference types which is the one thing we don’t have today. The ability to say: this string can never be null. You, compiler, warn me if I made a mistake such that I can ever find a null.” – Anders Hejlsberg, lead architect of C#, May 2011, Channel 9