C# 8 is moving aggressively into the innovation world. Because of this strategy, Microsoft left many developers in a confused state. Currently, the developers have a very controversial opinion on the C# 8 new features. In this article, you can have a brief overview of the new proposed features of C# 8 language. I will describe the important features separately and demonstrate them with an example; the other less important features I will handle briefly. I will also write about the pros and cons of each important upcoming feature. Furthermore, I will give a rating score for each feature between 1 (Bad) and 10 (Excellent), and finally, I hope after reading this article, you will have a clear vision of the C# 8 Features.

The rating score is based on the below-listed criteria,

The technology behind: It is based on a proven and reliable technology or not?

Innovation: Did Microsoft do any innovation in the proposed feature?

My personal opinion: Based on my discussions with the communities and my expertise. Important C# 8 stuff My free ebook: Introduction to C# 8

C# 8 Cheat Sheet C# 8 Features The new C# 8 features, Default interface methods Nullable reference types Pattern matching enhancements Asynchronous streams / Asynchronous disposable Using declarations Enhancement of interpolated verbatim strings Null-coalescing assignment Static local functions Indices and ranges Unmanaged constructed types Readonly-Member Stackalloc in nested expressions Disposable ref structs

Default Interface Methods

It allows you to add new functionality to the interfaces of your libraries and ensure the backward compatibility with code written for older versions of those interfaces.

Example

interface IWriteLine { public void WriteLine() { Console.WriteLine( "Wow C# 8!" ); } }

GitHub

Status: Prototype

Pros

You can add new functionality to the interface without breaking the compatibility with the older versions of those interfaces.

Cons

It should be used carefully. Otherwise, it can easily lead to violating the single responsibility principles.

Community

It is a very arguable feature, and it left many open discussions among the .NET community. I have handled this theme in depth in Reddit:

Innovation

There is nothing new here. This concept is already applied in many languages and cloned from Java.

Technique behind

It is based on traits technique, and traits is a proven, powerful technique in OOP.

For more information about traits proof theory:

My personal opinion

I give this feature score 3. My tip you should think before using it and ask yourself, is there any other elegant solution, which might fit better to solve your problem?

For more detailed information about this feature, you can read my article

Nullable reference type Emits a compiler warning or error if a variable that must not be null is assigned to null. Example string ? nullableString = null ; Console.WriteLine(nullableString.Length); GitHub https://github.com/dotnet/roslyn/tree/features/NullableReferenceTypes Status: Preview Pros It helps you to eliminate the NullReferenceException (The Billion Dollar Mistake, ALGOL60, Tony). Moreover, it helps you to solve the problems in code like a pyramid of doom. Cons However, in complex scenarios this feature may bring some confusion in regards to reference types and using “?” character for more information, please read https://codeblog.jonskeet.uk/2019/02/10/nullableattribute-and-c-8/ Community In general, this feature is well accepted among the .NET Community. Innovation Good innovation from Microsoft. Technique behind A proven technology. My personal opinion I give this feature 9. Yes, please use it! And, get rid of the NullReferenceException ! More Info https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#nullable-reference-types Advanced Pattern Matching

It provides the ability to deconstruct matched objects, giving you access to parts of their data structures. C# offers a rich set of patterns that can be used for matching.

Example

var point = new 3DPoint(1, 2, 3); if (point is 3DPoint(1, var myY, _)) { }

GitHub

Status: Preview

Pros

Recursive pattern matching helps you decompose and navigate data structures in a very convenient, compact syntax. While pattern matching is conceptually similar to a sequence of (if, then) statements, so it will help you to write the code in a functional style.

Cons

In complex expressions, the syntax might be tricky and difficult to understand.

Community

Well accepted among the .NET Community.

Innovation

There is nothing new here.

Technique behind

Pattern Matching is a proven and known technology, which has been used for many years especially in functional programming.

My personal opinion

I give this feature 9. I expected pattern matching in C# will be trendy like LINQ and Lambda expressions. This feature can be very good combined with Records to make C# syntax more functional, but I am not sure that the Records will be released in the next C# 8 version or not.

You can find more information about PM in my Pattern Matching Introduction:

Async streams

Allows using ‘ async ’ to iterate over collections. Example await foreach (var x in enumerable) { Console.WriteLine(x); } GitHub https://github.com/dotnet/roslyn/tree/features/async-streams Status: Preview Pros Async Streams provide an excellent way to represent asynchronous data sources that can be controlled by the consumer. For example, when downloading data from the web, we would like to create an asynchronous collection that returns the data in chunks as they become available. Community Well accepted. Innovation There is nothing new here! This technique is already used in many other languages Akka Streams. Technique behind Async Pull Programming Model is known and used for years. My personal opinion I give this feature 7. Please use it with the correct use cases like, downloading data from the web in chunks or getting a big query result in chunks from the database. More Info https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#asynchronous-streams Ranges Ranges are a very powerful construct when it comes to accessing sequences of data or getting a slice from a collection. This feature consisting of two parts, Part I Index Which can be used to obtain the collection from the beginning or from the end. Example Index i1 = 3; Index i2 = ^4; int [] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine($ "{a[i1]}, {a[i2]}" ); Part II Range Access a sub-collection(slice) from a collection. Example var slice = a[i1..i2]; GitHub https://github.com/dotnet/roslyn/tree/features/range Status: Preview Pros Nice syntax to access sequence of data from a collection. Innovation And again, nothing is new here. A lot of similar technology is already used in other languages like Python. Community Widely accepted. My personal opinion I give this feature an 8. It can make the code more readable and understandable. More Info https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#indices-and-ranges

Caller Expression Attribute ( Not C#8 , Changed to C#Next)

Allows the caller to 'stringify' the expressions passed in at a call site. The constructor of the attribute will take a string argument specifying the name of the argument to stringify.

Example

public static class Verify { public static void InRange( int argument, int low, int high, [CallerArgumentExpression( "argument" )] string argumentExpression = null , [CallerArgumentExpression( "low" )] string lowExpression = null , [CallerArgumentExpression( "high" )] string highExpression = null ) { if (argument < low) { throw new ArgumentOutOfRangeException(paramName: argumentExpression, message: $ " {argumentExpression} ({argument}) cannot be less than {lowExpression} ({low})." ); } if (argument > high) { throw new ArgumentOutOfRangeException(paramName: argumentExpression, message: $ "{argumentExpression} ({argument}) cannot be greater than {highExpression} ({high})." ); } } public static void NotNull < T > (T argument, [CallerArgumentExpression( "argument" )] string argumentExpression = null ) where T: class { if (argument == null ) throw new ArgumentNullException(paramName: argumentExpression); } } Verify.NotNull(array); "index (-1) cannot be less than 0 (0)." , or Verify.InRange(index, 0, array.Length - 1);

GitHub

Status: Prototype

Pros

Less code and more readable error message.

Community

-

Innovation

Again, there is nothing new here.

Technique behind

Data annotation.

My personal opinion:

I give this feature a 5. Yes, please use it to make a better error message.

I will only discuss the below features briefly.