
C# init Schlüsselwort (Wie es für Entwickler funktioniert)
Das init-Schlüsselwort in C# 9.0 führte eine neue Möglichkeit ein, Klassen-Eigenschaften zur Erstellung unveränderlicher Objekte zu definieren. In früheren Versionen von C# wurden Eigenschaften typischerweise mit get- und set-Accessoren verwendet, um auf Objektfelder zuzugreifen und sie zu ändern. Mit init können jedoch beschreibbare Eigenschaften nur während der Objektinitialisierung festgelegt werden und sind danach schreibgeschützt.
Dieses Tutorial wird die Verwendung des init-Schlüsselworts in C# mit praktischen Beispielen und Szenarien anhand der IronPDF-Bibliothek erforschen. Sie werden auch über die wesentlichen Unterschiede zwischen herkömmlichen Eigenschafts-Settern (set) und den neuen nur-init-Settern lernen.
Basisches Beispiel für das Init-Schlüsselwort
Beginnen wir mit einem einfachen Beispiel:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
var person = new Person
{
FirstName = "Iron",
LastName = "Dev"
};
// person.FirstName = "Jane"; // This will give a compile-time error.Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End Class
Private person = New Person With {
.FirstName = "Iron",
.LastName = "Dev"
}
' person.FirstName = "Jane"; // This will give a compile-time error.
In diesem Beispiel sind FirstName und LastName als init-only Eigenschaften markiert. Das bedeutet, dass sie nur während der Objektinitialisierung zugewiesen werden können. Nach der Erstellung des Objekts führt der Versuch, die Werte zu ändern, zu einem Compilerfehler.
Warum das Schlüsselwort Init verwenden?
Der Hauptgrund für die Verwendung des init-Schlüsselworts ist es, die Objekt-Eigenschaften nach der Initialisierung unveränderlich zu machen. Traditionell konnte man Eigenschaften als schreibgeschützt markieren, um Unveränderlichkeit zu erreichen. Allerdings benötigte man häufig einen Konstruktor, der alle notwendigen Werte akzeptiert, um die Felder zu setzen, was zu Konstruktor-Standardcode führen kann. Mit init kann man das gleiche Ziel mit Objektinitialisierern erreichen, ohne lange Konstruktoren schreiben zu müssen.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
// Without using constructor boilerplate for property initialization
}
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
' Without using constructor boilerplate for property initialization
End Class
Private person = New Person With {
.FirstName = "John",
.LastName = "Doe"
}Objektinitialisierung mit Init-Only-Eigenschaften
Die Verwendung von init funktioniert nahtlos mit Objektinitialisierern. Statt auf Konstruktoren zu setzen, um Werte zu setzen, können Sie die benötigten Eigenschaften direkt bei der Objekterstellung definieren.
public class Point
{
public int X { get; init; }
public int Y { get; init; }
}
var point = new Point { X = 10, Y = 20 };
// point.X = 30; // This will throw a compile-time errorPublic Class Point
Public Property X() As Integer
Public Property Y() As Integer
End Class
Private point = New Point With {
.X = 10,
.Y = 20
}
' point.X = 30; // This will throw a compile-time errorDies erstellt ein einfaches, unveränderliches Objekt vom Typ Point. Beachten Sie, dass die Werte für X und Y bei der Initialisierung festgelegt werden und später nicht mehr geändert werden können.
Mixing init mit Konstruktoren
Obwohl der primäre Anwendungsfall für init die Objektinitialisierung über Objektinitialisierer ist, können Sie bei Bedarf immer noch einen Konstruktor verwenden. Dies ist besonders nützlich, wenn bestimmte Eigenschaftswerte während der Objekterstellung erzwungen werden sollen.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End ClassSie können sowohl Konstruktoren als auch init-Eigenschaften zusammen verwenden. Dieser Ansatz bietet mehr Flexibilität und erzwingt dennoch die Unveränderlichkeit nach der Objekterstellung.
Vorteile von Init gegenüber Private Set
Früher verwendeten Entwickler einen privaten Set-Accessor, um die Eigenschaftsänderung außerhalb der Klasse zu begrenzen.
public class Person
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Private privateFirstName As String
Public Property FirstName() As String
Get
Return privateFirstName
End Get
Private Set(ByVal value As String)
privateFirstName = value
End Set
End Property
Private privateLastName As String
Public Property LastName() As String
Get
Return privateLastName
End Get
Private Set(ByVal value As String)
privateLastName = value
End Set
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End ClassObwohl dieser Ansatz funktioniert, erfordert er Konstruktor-Standardcode, um Eigenschaften zu initialisieren. Außerdem erlaubt es der Klasse selbst, die Eigenschaften später zu ändern, was nicht immer ideal für unveränderliche Objekte ist. Das init-Schlüsselwort behebt dieses Problem, da es nur die Initialisierung zum Zeitpunkt der Objekterstellung erlaubt und jede nachträgliche Änderung blockiert.
Handhabung der Initialisierung mit schreibgeschützten Feldern und Init Accessors
Das init-Schlüsselwort kann Felder oder Eigenschaften während der Objekterstellung initialisieren, während sie danach unveränderlich bleiben. Während schreibgeschützte Felder Unveränderlichkeit bieten, bietet der init-Accessor eine ähnliche Fähigkeit für Eigenschaften. So können Sie Unveränderlichkeit auf zwei Arten handhaben: mit schreibgeschützten Feldern und init-Eigenschaften.
Nutzung von schreibgeschützten Feldern mit einem Konstruktor
In diesem Beispiel verwenden wir schreibgeschützte Felder für firstName und lastName, die bei der Objekterstellung gesetzt werden. Diese Felder können nur einmal im Konstruktor zugewiesen werden und können danach nicht mehr geändert werden:
public class Person
{
private readonly string firstName;
private readonly string lastName;
public string FirstName => firstName;
public string LastName => lastName;
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}Public Class Person
'INSTANT VB NOTE: The field firstName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly firstName_Conflict As String
'INSTANT VB NOTE: The field lastName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly lastName_Conflict As String
Public ReadOnly Property FirstName() As String
Get
Return firstName_Conflict
End Get
End Property
Public ReadOnly Property LastName() As String
Get
Return lastName_Conflict
End Get
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.firstName_Conflict = firstName
Me.lastName_Conflict = lastName
End Sub
End ClassVerwendung von Init Accessors für die Initialisierung
Alternativ können wir den init-Accessor verwenden, um schreibgeschützte Eigenschaften zu erstellen, die während der Objekterstellung initialisiert, danach aber nicht mehr geändert werden dürfen. Dies erspart die Notwendigkeit für schreibgeschützte Felder und bietet eine modernere Syntax:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End ClassEinführung in IronPDF

IronPDF ist eine leistungsstarke PDF-Erzeugungs- und Manipulationsbibliothek, die für C#-Entwickler entwickelt wurde. Es vereinfacht die Arbeit mit PDFs, indem HTML, CSS, Bilder und andere Inhalte in PDF-Dokumente konvertiert werden. Mit Funktionen wie pixelgenauem Rendering, plattformübergreifender Unterstützung und einfacher Integration in .NET-Projekte ist IronPDF ideal für Entwickler, die schnell hochwertige PDFs erstellen müssen. Sie können es mit .NET Core, Framework und Standard verwenden, und es unterstützt eine Vielzahl von Plattformen, einschließlich Windows, Linux und macOS.
Fall: Verwendung von IronPDF mit C# Initialisierungs-Schlüsselwort
Um unveränderliche Objekte in einem C#-Projekt zu erstellen und dabei PDFs zu generieren, können Sie das init-Schlüsselwort mit IronPDF kombinieren. Das init-Schlüsselwort stellt die Integrität des Objekts nach seiner Initialisierung sicher, während IronPDF die Daten verarbeitet und PDFs basierend auf diesem unveränderlichen Modell erstellt.
Stellen Sie sicher, dass IronPDF in Ihrem Projekt korrekt referenziert ist. Sie können es über NuGet installieren:
Hier ist das Codebeispiel:
using IronPdf;
public class Person
{
public int Id { get; init; }
public string FirstName { get; init; }
public string LastName { get; init; }
}
public class PDFGenerator
{
public static void CreatePersonPDF(Person person)
{
var htmlContent = $@"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs($"Person_{person.Id}.pdf");
}
}
class Program
{
static void Main(string[] args)
{
var person = new Person
{
Id = 1,
FirstName = "Iron",
LastName = "Dev"
};
PDFGenerator.CreatePersonPDF(person);
}
}Imports IronPdf
Public Class Person
Public Property Id() As Integer
Public Property FirstName() As String
Public Property LastName() As String
End Class
Public Class PDFGenerator
Public Shared Sub CreatePersonPDF(ByVal person As Person)
Dim htmlContent = $"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs($"Person_{person.Id}.pdf")
End Sub
End Class
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim person As New Person With {
.Id = 1,
.FirstName = "Iron",
.LastName = "Dev"
}
PDFGenerator.CreatePersonPDF(person)
End Sub
End ClassAbschluss
Zusammenfassend ermöglicht das C# init-Schlüsselwort die Erstellung unveränderlicher Objekte und bietet Flexibilität während der Objektinitialisierung. Es ist eine sauberere und sichere Alternative zu privaten Set-Accessoren und reduziert die Notwendigkeit für Konstruktor-Standardcode. Die Kombination des init-Schlüsselworts mit schreibgeschützten Feldern, Strukturen und Validierungslogik hilft Ihnen, robuste und sichere Datenstrukturen zu erstellen, die Unveränderlichkeit bewahren, ohne Lesbarkeit oder Flexibilität zu opfern. IronPDF bietet eine kostenlose Testversion an, und Lizenzen beginnen ab $999. Dies gibt Ihnen Zugang zu seinen vollständigen Funktionen, einschließlich Bearbeiten, Komprimieren und Sichern von PDFs.

Jacob Mellor ist Chief Technology Officer bei Iron Software und ein visionärer Ingenieur, der Pionierarbeit in der C# PDF-Technologie leistet. Als der ursprüngliche Entwickler hinter der Kern-Codebasis von Iron Software hat er die Produktarchitektur des Unternehmens seit seiner Gründung geprägt und es zusammen mit CEO Cameron Rimington in ein Unternehmen mit mehr als 50 Mitarbeitern verwandelt, das die NASA, Tesla und globale Regierungsbehörden beliefert.
Verwandte Artikel


