modern-csharp
Modern C# language features for .NET 10 and C# 14. Covers primary constructors, collection expressions, the field keyword, extension members, records, pattern matching, spans, and raw string literals. Load this skill when writing any new C# code, reviewing existing code for modernization, using "mod
By codewithmukesh · 1,206 installs
npx skills add codewithmukesh/dotnet-claude-kit --skill modern-csharp
Source repository · Upstream listing
Modern C (C 14 / .NET 10)
Core Principles
1. Use the newest stable features — C 14 is the target. Prefer language level constructs over library workarounds.
2. Readability over cleverness — Pattern matching and expression bodied members improve readability when used appropriately; deeply nested patterns do not.
3. Value types where possible — Prefer record struct , Span<T , and stack allocation to reduce GC pressure.
4. Immutability by default — Use record , readonly , init , and required to make illegal states unrepresentable.
Patterns
Well Known Features Quick Reference
Feature Usage Example
Primary constructors DI injection, eliminate field assignments public class OrderService(IOrderRepo repo, TimeProvider clock) { }
Collection expressions [] for all collection types + spread List<string names = ["Alice", "Bob"]; / int[] all = [..a, ..b, 99];
Records DTOs, value objects, immutable data public record CreateOrderRequest(string CustomerId, List<OrderItem Items);
readonly record struct Small stack allocated value types public readonly record struct Money(decimal Amount, string Currency);
Pattern matching Switch expressions, list/property patterns order switch { { Total: 1000 } = "Premium", = "Standard" };
List patterns Deconstruct arrays/lists items switch { [] = "Empty", [var x] = $"One: {x}", [var f, .., var l] = $"{f}..{l}" };
Span<T Zero allocation slicing ReadOnlySpan<char trimmed = input.Trim(); int.TryParse(trimmed[4..], out id);
Raw string literals Multi line SQL, JSON, XML var sql = """ SELECT ... """; / interpolated: $$""" {"id": "{{id}}"} """;
required members Enforce initialization public required string ConnectionString { get; init; }
is pattern + extraction Null/type/property check if (result is { IsSuccess: true, Value: var order }) { ... }
The field Keyword (C 14)
Access the auto generated backing field in property accessors without declaring it manually.
Lazy Initialization with field
Change Notification with field
Extension Members (C 14)
C 14 adds extension blocks inside static classes. Unlike classic extension methods, they support extension properties and static extension members — the receiver is declared once for the whole block.
Classic this parameter extension methods still work and coexist — use extension blocks when you need properties or several members on the same receiver.
Anti patterns
Don't Use Obsolete Patterns When Modern Alternatives Exist
Don't Over pattern match
Don't Use var When the Type Is Not Obvious
Decision Guide
Scenario Recommendation
DTO / API contract record (reference type)
Small value object (2 3 fields) readonly record struct
Service with DI Primary constructor
Collection creation Collection expression []
Property with validation field keyword
Multi line string (SQL, JSON) Raw string literal """
Slicing strings/arrays Span<T
Type checking + extraction Pattern matching with is / switch
Enforced initialization required modifier
Adding methods to external types Extension members