Less boilerplate code with the new primary constructor in C# 12

The new language feature "primary constructor" which will be released with C# 12 / .NET 8 this year (November 2023) allows you to remove some ceremonial code. Let's see how. If you need a refresher on the primary constructors just click check out my blog post.

Dependency Injection setup

Prior to .NET 8 if we have a class that lives inside the Dependency Injection looks roughly like this:

public class MyService
{
  private readonly IDepedent dependent;
  
  public MyService(IDependent dependent)
  {
    this.dependent = dependent;
  }
  
  public void Do() 
  {
    dependent.DoWork();
  }
}

Thre more services you have, the more "setup" code you need. Here this new feature can help, and remove the whole private readonly part as well as all the initialization:

public class MyService(IDependent dependent)
{
  public void Do() 
  {
    dependent.DoWork();
  }
}

These two classes are completely the same. The compiler takes care of all the boilerplate code for you and creates the fields and assignments. You can have a look on sharplab.io to see that behind the scenes, roughly the same code is generated.

The downside to this approach is more that we have yet another way of doing a thing. That might be especially overwhelming for new joiners to the language that discover both approaches in one code base. A more extreme version of that is how you can check for null references - there are at least 4 ways to do so.

7
An error has occurred. This application may no longer respond until reloaded. Reload x