.NET C# 9.0 Features and Enhancements
A comprehensive guide to the new features and improvements introduced in C# 9.0, with detailed examples and implementation tips.
Introduction
With the release of .NET 5, Microsoft introduced C# 9.0, packed with powerful features aimed at improving developer productivity, reducing boilerplate code, and enhancing the overall programming experience. This blog delves into the key features of C# 9.0 with detailed explanations, examples, and use cases.
Whether you are a beginner or an experienced developer, this guide will help you understand and adopt these features in your .NET projects.
Records in C# 9.0
Records are a new reference type in C# 9.0 designed to represent immutable data. Unlike traditional classes, records provide value-based equality by default and are perfect for scenarios like data transfer objects (DTOs).
Example
public record Person(string FirstName, string LastName);
var person1 = new Person("John", "Doe");
var person2 = new Person("John", "Doe");
// Value-based equality
Console.WriteLine(person1 == person2); // True
The record type automatically generates useful methods like ToString()
, Equals()
, and GetHashCode()
.
You can also create mutable records by using positional properties with init
.
Init-Only Properties
Init-only properties allow you to set property values during object initialization but make them immutable afterward. This provides a safe way to create immutable objects while still using object initializers.
Example
public class Car
{
public string Make { get; init; }
public string Model { get; init; }
}
var car = new Car { Make = "Toyota", Model = "Corolla" };
// car.Make = "Honda"; // Compilation error
Pattern Matching Enhancements
Pattern matching in C# 9.0 introduces several enhancements, such as logical patterns, relational patterns, and the is not
operator.
These additions make conditional logic more expressive and concise.
Example
int number = 42;
if (number is > 10 and < 50)
{
Console.WriteLine("Number is between 10 and 50");
}
string text = "Hello";
if (text is not null)
{
Console.WriteLine("Text is not null");
}
Top-Level Statements
Top-level statements allow you to write concise, script-like programs without the need for a Main
method.
This is particularly useful for small utilities and prototyping.
Example
// No Main method needed
Console.WriteLine("Hello, World!");
Covariant Returns
Covariant return types in C# 9.0 allow overriding methods to return a more specific type than the base class method. This improves type safety and simplifies type conversions.
Example
public class Animal
{
public virtual Animal GetAnimal() => new Animal();
}
public class Dog : Animal
{
public override Dog GetAnimal() => new Dog();
}
Static Interfaces in C# 9.0
C# 9.0 supports static members in interfaces, enabling developers to define static methods, properties, and events within interfaces.
Example
public interface IShape
{
static double Pi => 3.14;
static double CalculateArea(double radius) => Pi * radius * radius;
}
Target-Typed Expressions
Target-typed expressions enable implicit conversions based on the target type, reducing redundant type declarations.
Example
List<int> numbers = new() { 1, 2, 3, 4 };
Conclusion
C# 9.0 introduces several features that simplify code, improve maintainability, and enhance developer productivity. From records and init-only properties to pattern matching and top-level statements, these enhancements make C# 9.0 a highly versatile language for modern development.
Start exploring these features in your projects today to unlock their full potential.