Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
C#

C#: Build Immutable Data with Record Types

- 25.07.26 - ErcanOPAK

📦 Record Types = Immutable Data

Mutable data structures cause bugs. Record types provide immutable, value-based data with value semantics.

📝 Record Syntax

// Basic Record
public record User(string Name, int Age, string Email);

// Usage
var user = new User("John Doe", 30, "john@example.com");
var name = user.Name; // Read-only

// With Expression (Non-destructive mutation)
var updatedUser = user with { Age = 31 };

// Record with Methods
public record Product(string Name, decimal Price, string Category)
{
    public decimal WithDiscount(decimal discountPercent) 
        => Price - (Price * discountPercent / 100);

    public override string ToString() 
        => $"{Name} ({Category}) - ${Price}";
}

// Record Inheritance
public record Person(string Name, string Email);
public record Customer(string Name, string Email, string CustomerId) : Person(Name, Email);

🎯 Advanced Record Patterns

// Positional vs Nominal Records
// Positional (Primary Constructor)
public record Order(int Id, DateTime OrderDate, decimal Total);

// Nominal (Explicit Properties)
public record Customer
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
    public string FullName => $"{FirstName} {LastName}";
}

// Record with Validation
public record ValidatedUser
{
    public string Name { get; init; }
    public int Age { get; init; }

    public ValidatedUser(string name, int age)
    {
        if (string.IsNullOrWhiteSpace(name))
            throw new ArgumentException("Name cannot be empty");
        if (age < 0 || age > 120)
            throw new ArgumentException("Invalid age");

        Name = name;
        Age = age;
    }
}

// Records in Collections
var users = new List<User>
{
    new User("Alice", 25, "alice@example.com"),
    new User("Bob", 30, "bob@example.com")
};

// Equality with Records
var user1 = new User("John", 30, "john@example.com");
var user2 = new User("John", 30, "john@example.com");

Console.WriteLine(user1 == user2); // True (Value equality)

// Records as DTOs
public record CreateUserRequest(string Name, string Email, int Age);
public record UpdateUserRequest(int Id, string Name, string Email);

💡 Record Best Practices

  • Use records for immutable DTOs
  • Use with expressions for updates
  • Implement validation in constructors
  • Use records for value-based data
  • Prefer records over classes for data containers

Records simplify data modeling in C#. They provide immutability and value semantics with minimal code.

— Senior Developer

Related posts:

C#: Use Generics for Type-Safe and Reusable Code

C#: Use DateOnly and TimeOnly When You Don't Need DateTime

C# Records Used Where Classes Fit Better

Post Views: 6

Post navigation

SQL: Master Window Functions for Advanced Analytics
C#: Write Cleaner Code with Pattern Matching

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com