In C# 9 record types were introduced.
A record in C# is a class or struct that provides special syntax and behavior for working with data models.
What makes them different from a ‘normal’ class or struct is that they offer the following functionality:
- Value equality: Two record types are equal if the types match and all property and fields match
- Immutability: You cannot change any property or field value after instantiation
You have 2 ways to define a record type. One way is similar to what you already know when creating classes or structs:
A second way is through positional parameters:
Behind the scenes, the compiler does a lot of work for us as it creates:
- A public autoimplemented property for each positional parameter provided in the record declaration
- A primary constructor whose parameters match the positional parameters on the record declaration.
- A
Deconstruct
method with anout
parameter for each positional parameter provided in the record declaration. The method deconstructs properties defined by using positional syntax; it ignores properties that are defined by using standard property syntax.
This makes our live a lot easier. No reason to complain.
But what if we want to add metadata to the generated properties?
Good question! The good news is that we can declare attributes at the positional parameter level and specify a target:
In the example above the System.Text.Json.Serialization.JsonPropertyNameAttribute is assigned to each property of the Person record. The property target is used to specify that the attribute applies to the compiler-generated property.