DEV Community

mohamed Tayel
mohamed Tayel

Posted on

required Keyword in C#

Meta Description:

Learn how the required keyword in C# simplifies object initialization, enforces compile-time checks, and prevents common runtime errors. Explore practical use cases, best practices, and examples in this comprehensive guide. Perfect for developers using .NET 7 and later!

Introduction

As developers, we often encounter issues when required properties of an object are left uninitialized, leading to frustrating runtime errors like the infamous NullReferenceException. Starting with .NET 7, C# introduces the required keyword, a feature designed to enforce property initialization at compile time, ensuring cleaner and safer code.

This article explores the required keyword, how it works, and where it can make your code more robust and maintainable.


Why Do We Need the required Keyword?

Before .NET 7, developers relied on constructors or manual validation to ensure that essential properties were initialized when creating an object. Forgetting to do so could result in runtime errors. The required keyword changes this paradigm by enforcing initialization at compile time, preventing errors before they happen.

Example of the Problem:

Without required, forgetting to initialize a property is easy:

public class Product  
{  
    public string Name { get; set; }  
    public decimal Price { get; set; }  
}  

var product = new Product();  
// Runtime error occurs later if `Name` is accessed and is null.
Enter fullscreen mode Exit fullscreen mode

With the required keyword, you ensure the property is always initialized:

public class Product  
{  
    public required string Name { get; set; }  
    public decimal Price { get; set; }  
}  

var product = new Product { Name = "Laptop", Price = 1500.00m };  
// Safe: The compiler enforces initialization.
Enter fullscreen mode Exit fullscreen mode

How the required Keyword Works

1. Declaring required Properties

The required keyword can be added to properties, indicating they must be initialized during object creation:

public class Product  
{  
    public required string Name { get; set; }  
    public decimal Price { get; set; }  
}
Enter fullscreen mode Exit fullscreen mode

2. Initializing with Object Initializers

You can use object initializers to set required properties:

var product = new Product  
{  
    Name = "Smartphone",  
    Price = 999.99m  
};
Enter fullscreen mode Exit fullscreen mode

3. Initializing in Constructors

required properties can also be set in constructors, giving you flexibility:

public Product(string name)  
{  
    Name = name;  
}
Enter fullscreen mode Exit fullscreen mode

4. Error Scenario

If a required property is not initialized, the compiler generates an error:

var invalidProduct = new Product { Price = 1500.00m };  
// Compiler Error: 'Name' is required but not initialized.
Enter fullscreen mode Exit fullscreen mode

Practical Use Cases for required

The required keyword is ideal in scenarios where certain properties are essential for an object’s validity:

  1. Domain Models

    • Ensure essential fields like Name, Id, or Email are always set.
  2. DTOs (Data Transfer Objects)

    • Enforce the presence of critical fields when exchanging data between systems.
  3. Configuration Settings

    • Guarantee that required settings are initialized before using them.

Best Practices

When to Use required:

  • Use it for properties that are critical for the correct functioning of the object.
  • Avoid using required for properties that have reasonable default values.

Avoid Overuse:

  • Marking too many properties as required can make your code overly rigid and harder to maintain.

Comparisons and Compatibility

Before .NET 7:

Developers relied on constructors or runtime checks:

public class Product  
{  
    public string Name { get; set; }  

    public Product(string name)  
    {  
        if (string.IsNullOrWhiteSpace(name))  
            throw new ArgumentException("Name is required.");  

        Name = name;  
    }  
}
Enter fullscreen mode Exit fullscreen mode

With required:

The required keyword simplifies this logic and shifts the responsibility to compile time:

public required string Name { get; set; }
Enter fullscreen mode Exit fullscreen mode

Compatibility:

The required keyword is supported in .NET 7 and later. It cannot be used in earlier versions of .NET.


Potential Pitfalls

  1. Inheritance

    If a base class has a required property, derived classes must initialize it too.

  2. Overuse

    Marking too many properties as required can make your object difficult to work with, especially in testing scenarios.

  3. Read-Only Properties

    required cannot be applied to read-only properties (get only).


Conclusion

The required keyword is a powerful addition to C#, ensuring safer and cleaner object initialization. By enforcing initialization at compile time, it prevents common runtime errors and reduces boilerplate code.

When used judiciously, required can make your code more reliable and maintainable, especially in domain models, DTOs, and configuration classes.

Try incorporating required into your next project, and experience the benefits of safer object initialization in C#.

Top comments (0)