.NETEasy
Explain init-only setters and required members in modern C#
Init-only setters make a property settable only during object initialisation:
public record Order {
public Guid Id { get; init; }
public string Email { get; init; } = "";
}
var o = new Order { Id = Guid.NewGuid(), Email = "a@b.com" };
o.Email = "new"; // ❌ compile error
Required members enforce that callers MUST set them in an object initializer:
public record User {
public required string Email { get; init; }
public required string Name { get; init; }
}
var u = new User { Email = "a@b.com" }; // ❌ compile error — Name not set
var u = new User { Email = "a@b.com", Name = "A" }; // ✓
Together they replace ~80% of constructor boilerplate while keeping objects immutable and explicit.
Caveat: required works at compile time only — reflection / serializers won't enforce it. Use Zod/DataAnnotations validation for runtime contracts.