Sie sind hier:
Lexikon/Glossar
Telefon (Mo-Fr 9-16 Uhr):
0201/649590-0
|
Kontaktformular
MENU
Start
Hauptseite
Angebote im Überblick
Kernkompetenzen
Softwareentwicklung
Beratung
Firmen-Schulungen
Offene Seminare
Online-Maßnahmen
Vorträge
Coaching
Support
Fachbücher
Fachartikel
Konditionen
Themen
Kernkompetenzen
Aktuelle Themen
Web & Cloud
Apps / Mobilplattformen
Benutzeroberflächen / User Experience
.NET
JavaScript / TypeScript
Java
Programmiersprachen
Entwicklungswerkzeuge
Scripting
Softwareengineering
Datenbanken / Reporting / BI
Betriebssysteme & Virtualisierung
Microsoft Server-Produkte
Windows & Office für Anwender
Soft Skills & IT-Recht
Beratung
Beratungsthemen
Coaching
Softwareentwicklung
Technischer Support
Unsere Top-Berater
Referenzkunden
Angebotsanfrage
Individuelle Schulungen
1026 Schulungsthemen
Agendakonfigurator
Weiterbildungsphilosophie
Didaktische Konzepte
Vor Ort oder online
Unsere Top-Trainer
Referenzkunden
Teilnehmerfeedback
Angebotsanfrage
Offene Seminare
.NET-Akademie
.NET/C#-Basisseminar
WPF
WinUI
.NET MAUI
Blazor
ASP.NET WebAPI & gRPC
Entity Framework Core
Unit Testing / TDD
PowerShell
Infotage
Wissen
Übersicht
Fachbücher
Fachartikel
Konferenzvorträge
Konferenzen/Events
Spickzettel
Lexikon/Glossar
Programmcodebibliothek
Versionshistorie
Weblog
Downloads
Newsletter
Community-/Leserportal
Registrierung
.NET/C#/Visual Studio
.NET 10.0
.NET 9.0
.NET 8.0
ASP.NET (Core)/Blazor
PowerShell
Über uns
Kontakt
Selbstdarstellung
Kernkompetenzen
Dr. Holger Schwichtenberg
Top-Experten
Leitung & Kundenteam
Referenzkunden
Kundenaussagen
Referenzprojekte
Partner
Konditionen
Stellenangebote
Weitere Websites
Impressum
Datenschutzerklärung, Haftung, Urheberrecht, Barrierefreiheit
Suche
Themenkatalog
Tag Cloud
Volltextsuche
Site Map
FAQs
Erklärung des Begriffs: Primärkonstruktor
Zur Stichwortliste unseres Lexikons
Was ist
Primärkonstruktor
?
Die wesentliche, schon seit
.NET 8.0
Preview 2 implementierte Neuerung in
C# 12.0
sind die Primärkonstruktoren für Klassen. Alte Hasen unter den C#-Entwicklern werden sich erinnern, dass dieses Sprachfeature bereits im Jahr 2014 als
Prototyp
für
C# 6.0
verfügbar war, dann aber doch gestrichen wurde.
Nun, sechs C#-Versionen weiter, kommt Microsoft in
C# 12.0
darauf zurück, auch vor dem Hintergrund der Record-Typen, die es seit
C# 9.0
mit Primärkonstruktoren gibt:
public record Person(int ID, string Name, string Website = "");
Ein Primärkonstruktor ist eine Parameterliste direkt hinter dem
Typname
n. In
C# 12.0
ist das auch für Klassendefinitionen möglich:
public class Person(int ID, string Name, string Website = "");
Solch eine Klasse kann ohne Inhaltsbereich (also geschweifte Klammern) existieren, ist aber wertlos. Anders als bei den in
C# 9.0
eingeführten Record-Typen erstellt der Primärkonstruktor -nämlich keine öffentlichen Properties in der Klasse, sondern nur private
Field
s. Wenn man diese Klasse mit Primärkonstruktor in einem
Decompiler
betrachtet, sieht man zunächst überhaupt keine Verarbeitung der Parameter im Primärkonstruktor:
public class Person
{
public Person(int ID, string Name, string Website = "")
{
}
}
Das liegt daran, dass die Primärkonstruktorparameter gar nicht verwendet werden. Wir müssen die Klasse z.B. um ToString() erweitern, siehe Listing 1. Nun sehen wir im
Decompiler
, dass für jeden Primärkonstruktorparameter ein privates
Field
angelegt wurde inklusive Zuweisung im Konstruktor (Listing 2).
Listing 1: Klasse mit Primärkonstruktor und
Methode
ToString(), in der alle Primärkonstruktor verwendet werden
public class Person(int ID, string Name, string Website = "")
{
public override string ToString()
{
return $"Person #{ID}: {Name} -> {Website}";
}
}
Listing 2: Decompilat von Listing 1 mit ILSpy 8.0.0.7246-preview3
public class Person
{
[CompilerGenerated]
[
Debugger
Browsable(
Debugger
BrowsableState.Never)]
private int <ID>PC
Backing
Field
;
[CompilerGenerated]
[
Debugger
Browsable(
Debugger
BrowsableState.Never)]
private string <Name>PC
Backing
Field
;
[CompilerGenerated]
[
Debugger
Browsable(
Debugger
BrowsableState.Never)]
private string <Website>PC
Backing
Field
;
public Person(int ID, string Name, string Website = "unbekannt")
{
<ID>PC
Backing
Field
= ID;
<Name>PC
Backing
Field
= Name;
<Website>PC
Backing
Field
= Website;
base..ctor();
}
public override string ToString()
{
return $"Person #{<ID>PC
_Backing
Field
}: {<Name>PC__Backing
Field
} -> {<Website>PC_
Backing
Field
}";
}
}
Um öffentlich auf die im Primärkonstruktor übergebenen Daten zugreifen zu können, muss man die Konstruktorparameter für Zuweisungen verwenden, siehe Name und Website im Listing 3. In Listing 3 gibt es neben der Klasse Person eine zweite, abgeleitete Klasse Autor mit Primärkonstruktor.
Listing 3: Primärkonstruktorbeispiel mit Zuweisung der Primärkonstruktorparameter an öffentliche Properties und
Vererbung
using
System.ComponentModel
.Data
Annotation
s;
using ITVisions;
namespace NET8Konsole.CS12;
/// <summary>
/// Klasse mit Primärkonstruktor
/// </summary>
public class Person(Guid personGuid, string name)
{
public Guid PersonGuid { get; set; } = personGuid;
public string Name { get; set; } = name;
public Person() : this(Guid.Empty, "")
{
// Aufruf ohne Parameter möglich, führt aber zu einem ungültigen
Objekt
;-)
}
public override string ToString()
{
return $"Person {personGuid}: {Name}";
}
}
/// <summary>
/// Abgeleitete Klasse mit Primärkonstruktor
/// </summary>
public class Autor(Guid personGuid, string name, string website) : Person(personGuid, name)
{
public string Website { get; set; } = website;
public override string ToString()
{
return $"Autor {personGuid}: {Name} -> {Website}";
}
}
internal class CS12
PrimaryConstructors
Demo
{
public void Run()
{
var p = new Person();
Console.WriteLine(p.Name);
Console.WriteLine(p.ToString());
var a = new Autor(Guid.NewGuid(), "
Dr. Holger Schwichtenberg
", "www.IT-Visions.de");
Console.WriteLine(a.Name);
Console.WriteLine(a.Website);
Console.WriteLine(a.ToString());
}
}
Querverweise zu anderen Begriffen im Lexikon
System.ComponentModel
Annotation
Decompiler
Vererbung
.NET 8.0 (.NET 8)
Debugger
Prototyp
Methode
Typname
Objekt
Field
CSharp 12.0 (C# 12.0)
CSharp 9.0 (C# 9.0)
CSharp 6.0 (C# 6.0)
Beratung & Support
Anfrage für Beratung/Consulting zu PRIMä RKONSTRUKTOR
Gesamter Beratungsthemenkatalog
Technischer Support zum PRIMä RKONSTRUKTOR
Schulungen
C# 12.0 - Neuerungen gegenüber C# 11.0
Anfrage für eine individuelle Schulung zum Thema PRIMä RKONSTRUKTOR
Gesamter Schulungsthemenkatalog
Fachbücher
Blazor 10.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 10.0, C# 14.0 und Visual Studio 2026
C# 14.0 Crashkurs
Moderne Datenzugriffslösungen mit Entity Framework Core 10.0
.NET 10.0 Update: Die Neuerungen in .NET 10.0 gegenüber .NET 9.0
Blazor 9.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 9.0, C# 13.0 und Visual Studio 2022
C# 13.0 Crashkurs
Cross-Plattform-Apps mit .NET MAUI entwickeln
Moderne Datenzugriffslösungen mit Entity Framework Core 9.0
.NET 9.0 Update: Die Neuerungen in .NET 9.0 gegenüber .NET 8.0
PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
.NET 8.0 Update: Die Neuerungen in .NET 8.0 gegenüber .NET 7.0
Concurrency with Modern C++: What every professional C++ programmer should know about concurrency
C++20: Get the Details
Blazor 8.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 8.0, C# 12.0 und Visual Studio 2022
Moderne Datenzugriffslösungen mit Entity Framework Core 8.0
C# 12.0 Crashkurs
App-Entwicklung für Mobile und Desktop: Software Engineering mit .NET MAUI und Comet für iOS, Android, Windows und macOS
Cross-Plattform-Apps mit .NET MAUI entwickeln
Blazor 7.0: Blazor WebAssembly, Blazor Server und Blazor Hybrid
C# 11.0 Crashkurs
Moderne Datenzugriffslösungen mit Entity Framework Core 7.0
PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
C++ Core Guidelines Explained: Best Practices for Modern C++
App Engineering: SwiftUI, Jetpack Compose, .NET MAUI und Flutter
Vue.js 3 Crashkurs
Moderne Datenzugriffslösungen mit Entity Framework Core 6.0
Blazor 6.0: Blazor WebAssembly, Blazor Server und Blazor Desktop
C# 10.0 Crashkurs
Cross-Plattform-Apps mit Xamarin.Forms entwickeln
Developing Web Components with TypeScript: Native Web Development Using Thin Libraries
Alle unsere aktuellen Fachbücher
E-Book-Abo für ab 99 Euro im Jahr