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