Primärkonstruktoren und ihre Fallstricke
- Matt
Seit C# 12 gibt es Primärkonstruktoren auch für normale Klassen:
public class KundenService(IKundenRepository repo, ILogger<KundenService> logger)
{
public Task<Kunde?> Laden(Guid id) => repo.Laden(id);
}
Das spart bei DI-lastigen Klassen viele Zeilen. Zwei Unterschiede zu Records sollte man kennen.
Erstens: Es entstehen keine öffentlichen Eigenschaften. Die Parameter sind im Rumpf sichtbar, aber nicht von außen. Das ist meistens gewollt.
Zweitens: Die Parameter sind nicht readonly. Man kann ihnen innerhalb der Klasse etwas zuweisen, und der Compiler sagt nichts. Bei einem Feld mit readonly hätte er gemeckert.
Deshalb nehme ich sie für Abhängigkeiten, aber nicht für Zustand.