Difference between class and record type in C#

A thumbnail showing C# code.

Class vs Record

The main difference between class and record type in C# is that a record has the main purpose of storing data, while class define responsibility. Records are immutable, while classes are not.

Other differences include between class and record type include:

  • We define records using the record keyword instead of the class keyword.
  • Records should not have any state changes after instantiation, while classes change properties.
  • We create new records from existing ones when we want to change state. With classes, we modify the existing ones.

When to use a record over a class?

Use a record when an object's only purpose is to contain public data. On other hand, use a class if your object has unique logic. Classes are mutable so even if they have the same data, doesn't mean they are the same.

For example, if we think about a class that represents a window. Two windows on a house can look the same, have the same size and color, but they are not the same:

C# Class example illustration.
Classes have the same data, but they are not the same.

On the other hands, if we think of records as just bag of data, we only care about data being the same:

C# Record example illustration.
Records have the same data, so they are considered equal.

What is immutability?

Immutability is the concept of an object that cannot change after creation. This is a useful concept because it helps to ensure that we don't accidentally change or corrupt data.

We often use immutable objects for caching or for storing sensitive information. C# record type supports immutability because we cannot change them after instantiation.

Nondestructive mutation

Nondestructive mutation is creating a new object from an existing one, while copying over the data from the original object.

Unlike classes, records have a language-supported pattern for nondestructive mutation.

To use the nondestructive mutation in C#, we use the with keyword:

var secondWindow = firstWindow with { Color = "Blue" };

In the example above, we use nondestructive mutation to copy the Window record with different color.

Here's the full example:

public record Window
    public int Size { get; init; }
    public string Color { get; init; }


var firstWindow = new Window { Size = 10, Color = "Red" };
Console.WriteLine(firstWindow); // Window { Size = 10, Color = Red }

var secondWindow = firstWindow with { Color = "Blue" };
Console.WriteLine(secondWindow); // Window { Size = 10, Color = Blue }
Published on