C# 9 adds records, finally! I've been waiting forever for this, it's supergreat! But I'm wondering what the point of having a record with { get; set; } is? It seems like records should be immutable and use { get; init; } for all their properties. Maybe I'm just too used to working with immutable data, but I don't get the point of mutable records. It just seems like it increases the likelihood of bugs in the code. Am I missing a really obvious and useful usecase?
To start with: a record is just a quick, short notation to declare a class with a couple of useful features automatically added for free - but the end result is still a class like any other. It is syntactic sugar, with actually two flavours.
The extra-short positional syntax makes all properties init-only:
record Person(string FirstName, string LastName);
The less-short nominal syntax makes the developer responsible to specify set or init for each property:
record Person
{
public string FirstName { get; set; }
public string LastName { get; init; }
}
The reason behind offering both notations is that there is no 'one-size-fits-all'. Nominal syntax allows to create a class with very little code, with specific custom (im)mutability, and still get a copy constructor + cloning + hashing + comparison/equality for free.