Primary Constructors in C# 12.0

Constructors are fundamental to object-oriented programming, serving as special methods that are invoked when creating an instance of a class or struct. They enable the initialization of an object’s fields and properties, ensuring the object is in a valid state before use. With the advent of C# 12.0, a new feature known as primary constructors has been introduced, enhancing the language’s capabilities for defining constructors.

Primary constructors offer a more concise and readable way to declare constructors, reducing boilerplate code and streamlining object initialization. This feature is particularly beneficial for developers looking to improve the clarity and maintainability of their code.

Syntax and Usage

The basic syntax of a primary constructor in C# 12.0 is straightforward. It allows developers to define constructor parameters directly within the class or struct declaration, which are then in scope throughout the type. Here’s a simple example:

public class Point(int x, int y)
    // The parameters x and y are available throughout the class

This syntax enables the direct initialization of properties and fields within the constructor parameter list, distinguishing primary constructors from traditional constructor syntax.

Features and Advantages

Primary constructors come with several key features:

  • They are available for use in both classes and structs.
  • Constructor parameters have scope throughout the type.
  • Private fields for parameter values are implicitly created.

These features contribute to improved code readability and maintainability. For instance, primary constructors can simplify scenarios like initializing calculated readonly properties:

public readonly struct Distance(double dx, double dy)
    public readonly double Magnitude { get; } = Math.Sqrt(dx * dx + dy * dy);
    public readonly double Direction { get; } = Math.Atan2(dy, dx);

Comparison to Existing Approaches

Primary constructors offer a more concise and efficient alternative to traditional methods for initializing properties and fields. Unlike traditional constructors, field initializers, and property setters, primary constructors allow for the initialization of members directly within the constructor parameter list, reducing redundancy and enhancing code conciseness.

However, there may be trade-offs to consider, such as the requirement that any other constructors must call through the primary constructor.

Best Practices and Recommendations

To effectively use primary constructors in your code, it’s recommended to:

  • Utilize them when you want to reduce boilerplate code and improve readability.
  • Choose primary constructors over traditional approaches when you need to initialize members directly within the constructor parameter list.

As the feature evolves, we may see further improvements and advancements that will continue to enhance the developer experience with primary constructors.


Primary constructors in C# 12.0 represent a significant step forward in simplifying object initialization. They offer a more concise and readable syntax, improve code maintainability, and provide a modern approach to defining constructors. As developers adopt this feature, it’s expected to become a staple in the C# programming paradigm.

Thank you for reading.

This post is licensed under CC BY 4.0 by the author.