
C# Słowo kluczowe init (Jak to działa dla programistów)
Słowo kluczowe init w C# 9.0 wprowadziło nowy sposób definiowania właściwości klas w celu tworzenia obiektów niezmiennych. W wcześniejszych wersjach języka C# właściwości były zazwyczaj używane wraz z akcesorami get i set do odczytu i zapisu w polach obiektów. Jednak dzięki init można ustawić właściwości jako zapisywalne tylko podczas inicjalizacji obiektu, a później uczynić je tylko do odczytu.
W tym samouczku omówimy użycie słowa kluczowego init w języku C# na praktycznych przykładach i scenariuszach z wykorzystaniem biblioteki IronPDF. Dowiesz się również o kluczowych różnicach między tradycyjnymi ustawnikami właściwości (set) a nowymi ustawnikami typu init-only.
Podstawowy przykład słowa kluczowego Init
Zacznijmy od prostego przykładu:
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.
W tym przykladzie FirstName i LastName sa oznaczone jako wlasciwosci tylko-do-inicjalizacji. Oznacza to, że można je przypisywać wyłącznie podczas inicjalizacji obiektu. Po utworzeniu obiektu próba zmiany wartości spowoduje błąd kompilacji.
Dlaczego warto używać słowa kluczowego "Init"?
Głównym powodem użycia słowa kluczowego init jest uczynienie właściwości obiektu niezmiennymi po inicjalizacji. Tradycyjnie można było oznaczyć właściwości jako tylko do odczytu, aby osiągnąć niezmienność. Często jednak potrzebny jest konstruktor, który akceptuje wszystkie wartości niezbędne do ustawienia pól, co może prowadzić do powstawania szablonowego kodu konstruktóra. Dzięki init możesz osiągnąć ten sam cel, używając inicjalizatorów obiektów bez pisania długich konstruktorów.
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"
}Inicjalizacja obiektów za pomocą właściwości typu Init-Only
Korzystanie z init działa płynnie z inicjalizatorami obiektów. Zamiast polegać na konstruktórach do ustawiania wartości, możesz zdefiniować potrzebne właściwości bezpośrednio podczas tworzenia obiektu.
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 errorTo tworzy prosty, niezmienny obiekt typu Point. Zauwaz, ze wartosci dla X i Y sa ustawiane przy inicjalizacji i nie mozna ich pozniej zmienic.
Mieszanie init z konstruktórami
Chociaż głównym zastosowaniem init jest inicjalizacja obiektów za pomocą inicjalizatorów obiektów, w razie potrzeby nadal można użyć konstruktóra. Jest to szczególnie przydatne podczas wymuszania określonych wartości właściwości podczas tworzenia obiektów.
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 ClassMożna używać zarówno konstruktorów, jak i właściwości init jednocześnie. Takie podejście zapewnia większą elastyczność, jednocześnie wymuszając niezmienność po utworzeniu obiektu.
Zalety Init w porównaniu z Private Set
Wcześniej programiści używali prywatnego akcesora set, aby ograniczyć modyfikację właściwości poza klasą.
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 ClassChociaż takie podejście działa, wymaga ono użycia szablonowego kodu konstruktóra do zainicjowania właściwości. Ponadto pozwala to samej klasie na późniejsze modyfikowanie właściwości, co nie zawsze jest idealnym rozwiązaniem w przypadku obiektów niezmiennych. Słowo kluczowe init eliminuje ten problem, ponieważ pozwala na inicjalizację tylko w momencie tworzenia obiektu i blokuje wszelkie późniejsze modyfikacje.
Obsługa inicjalizacji za pomocą pól tylko do odczytu i akcesorów inicjalizacyjnych
Słowo kluczowe init może inicjalizować pola lub właściwości podczas tworzenia obiektu, a po tym procesie pozostają one niezmienne. Podczas gdy pola tylko do odczytu zapewniają niezmienność, akcesor init oferuje podobną funkcjonalność dla właściwości. Oto dwa sposoby radzenia sobie z niezmiennością: za pomocą pól tylko do odczytu i właściwości init.
Korzystanie z pól tylko do odczytu w konstruktorze
W tym przykladzie uzywamy pol tylko-do-odczytu dla firstName i lastName, ktore sa ustawiane podczas konstrukcji obiektu. Pola te można przypisać tylko raz w konstruktorze i nie można ich później modyfikować:
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 ClassWykorzystanie akcesorów Init do inicjalizacji
Alternatywnie możemy użyć akcesora init do utworzenia właściwości tylko do odczytu, które można zainicjować podczas tworzenia obiektu, ale których nie można później zmienić. Eliminuje to potrzebę stosowania pól tylko do odczytu i zapewnia bardziej nowoczesną składnię:
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 ClassWprowadzenie do IronPDF

IronPDF to potężna biblioteka do generowania i edycji plików PDF przeznaczona dla programistów C#. Ułatwia pracę z plikami PDF poprzez konwersję HTML, CSS, obrazów i innych treści do dokumentów PDF. Dzięki takim funkcjom, jak renderowanie z dokładnością do piksela, obsługa wielu platform oraz łatwa integracja z projektami .NET, IronPDF jest idealnym rozwiązaniem dla programistów, którzy muszą szybko tworzyć pliki PDF o wysokiej jakości. Można go używać z .NET Core, .NET Framework i .NET Standard, a ponadto obsługuje szeroki zakres platform, w tym Windows, Linux i macOS.
Przypadek: Uzywanie IronPDF ze slowem kluczowym Init w C#
Aby utworzyć obiekty niezmienne w projekcie C# podczas generowania plików PDF, można połączyć słowo kluczowe init z biblioteką IronPDF. Słowo kluczowe init zapewnia integralność obiektu po jego zainicjowaniu, podczas gdy IronPDF przetwarza dane i generuje pliki PDF w oparciu o ten niezmienny model.
Upewnij się, że w projekcie poprawnie odwołujesz się do IronPDF. Można ją zainstalować za pośrednictwem NuGet:
Oto przykładowy kod:
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 ClassWnioski

Podsumowując, słowo kluczowe init w języku C# pozwala tworzyć obiekty niezmienne, oferując jednocześnie elastyczność podczas inicjalizacji obiektów. Jest to czystsza i bezpieczniejsza alternatywa dla prywatnych akcesorów zestawów, zmniejszająca potrzebę stosowania szablonowego kodu konstruktóra. Połączenie słowa kluczowego init z polami tylko do odczytu, strukturami i logiką walidacji pomaga tworzyć solidne i bezpieczne struktury danych, które zachowują niezmienność bez utraty czytelności lub elastyczności. IronPDF oferuje bezplatna wersje probna, a licencje zaczynaja sie od $999. Daje to dostęp do wszystkich funkcji, w tym edycji, kompresji i zabezpieczania plików PDF.

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.
Powiązane artykuły


