C# Init Keyword(開発者向けの仕組み)
C# 9.0 の init キーワード は、イミュータブルなオブジェクトを作成するための新しいクラスプロパティの定義方法を導入しました。 C# の以前のバージョンでは、プロパティは通常、get および set アクセサーを使用してオブジェクトフィールドを読み書きしていました。 しかし、init を使用すると、オブジェクト初期化時のみ書き込み可能なプロパティを作成し、その後は読み取り専用にします。
このチュートリアルでは、IronPDF ライブラリを使った C# init キーワードの実践的な例とシナリオを探求します。 また、従来のプロパティセッター(set)と新しい init のみのセッターの重要な違いについても学びます。
Init キーワードの基本的な例
基本的な例から始めましょう:
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 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.
この例では、FirstName と LastName が init のみのプロパティとしてマークされています。 これは、オブジェクトの初期化時だけに代入できることを意味します。 オブジェクトが作成された後、値を変更しようとするとコンパイル時エラーになります。
なぜ Init キーワードを使用するのか?
init キーワードを使用する主な理由は、初期化後にオブジェクトプロパティをイミュータブルにすることです。 従来、プロパティを読み取り専用としてマークしてイミュータビリティを実現することができました。 しかしながら、フィールドを設定するためのすべての必要な値を受け入れるコンストラクターがしばしば必要になり、コンストラクターボイラープレートコードの原因となることがあります。 init を使用すれば、長いコンストラクターを書くことなく、オブジェクト初期化子を使用して同じ目標を達成できます。
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 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"
}Init のみのプロパティによるオブジェクトの初期化
init を使用すると、オブジェクト初期化子とシームレスに連携できます。 コンストラクターに頼らずに値を設定する代わりに、オブジェクトを作成しながら必要なプロパティを直接定義できます。
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 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 errorこれは Point 型の単純なイミュータブルなオブジェクトを作成します。 初期化時に X と Y の値が設定され、その後は変更できません。
コンストラクターとの Init の混合利用
init の主な使用ケースはオブジェクト初期化子を通じたオブジェクト初期化ですが、必要に応じてコンストラクターを使用することもできます。 これはオブジェクトの作成中に特定のプロパティ値を強制する際に特に有用です。
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 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 Classコンストラクターと init プロパティの両方を一緒に使用できます。 このアプローチは、オブジェクト構築後のイミュータビリティを維持しながら、より多くの柔軟性を提供します。
Private Set よりも Init の利点
以前の開発者は、クラス外部でのプロパティ変更を制限するためにプライベート set アクセサーを使用していました。
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
{
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 Classこのアプローチは機能しますが、プロパティを初期化するためにコンストラクターボイラープレートコードが必要です。 また、クラス自体が後でプロパティを変更できるようになるため、必ずしもイミュータブルなオブジェクトに理想的であるとは限りません。 init キーワードは、この問題を解決します。オブジェクト作成時の初期化のみを許可し、その後の変更はブロックされます。
読み取り専用フィールドと Init アクセサーによる初期化の処理
init キーワードは、オブジェクト作成時にフィールドまたはプロパティを初期化し、その後イミュータブルのままにします。 読み取り専用フィールドはイミュータビリティを提供しますが、init アクセサーはプロパティに対して同様の機能を提供します。 ここでは、読み取り専用フィールドと init プロパティを使用してイミュータビリティを処理する方法を示します。
コンストラクターを用いた読み取り専用フィールドの使用
この例では、オブジェクト構築時に設定される firstName と lastName の読み取り専用フィールドを使用します。 これらのフィールドはコンストラクター内で一度だけ代入可能で、その後は変更できません。
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
{
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 Classイニット アクセサーによる初期化の使用
または、init アクセサーを使用してオブジェクト作成時に初期化できるがその後変更できない読み取り専用プロパティを作成することができます。 これにより、読み取り専用フィールドは不要になり、より現代的な構文を提供します。
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}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 ClassIronPDFの紹介

IronPDF は、C# 開発者向けに設計された強力な PDF 生成および操作ライブラリです。 PDF を HTML、CSS、画像、その他のコンテンツから変換して作成する作業を簡素化します。 ピクセルパーフェクトなレンダリング、クロスプラットフォームのサポート、および .NET プロジェクトへの簡単な統合などの機能を備えた IronPDF は、高品質な PDF を迅速に作成する必要がある開発者に最適です。 .NET Core、Framework、および Standard で使用でき、Windows、Linux、macOS など幅広いプラットフォームをサポートします。
ケース:C# Init キーワードと IronPDF の使用
C# プロジェクトでイミュータブルなオブジェクトを作成しながら PDF を生成するには、init キーワードを IronPDF と組み合わせて使用できます。 init キーワードはオブジェクトが初期化された後の整合性を保証し、IronPDF はそのイミュータブルなモデルに基づいてデータを処理し、PDF を生成します。
プロジェクトに IronPDF が正しく参照されていることを確認してください。 NuGet 経由でインストールできます:
Install-Package IronPdf
コード例はこちら:
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);
}
}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 Class結論

要するに、C# の init キーワードは、オブジェクト初期化時に柔軟性を提供しながら、イミュータブルなオブジェクトを作成することを可能にします。 これは、プライベート set アクセサーに代わるよりクリーンで安全な選択肢であり、コンストラクターボイラープレートコードを削減します。 init キーワードを読み取り専用フィールド、構造体、および検証ロジックと組み合わせることで、読みやすさや柔軟性を損なうことなく、イミュータビリティを維持する堅牢で安全なデータ構造を構築するのに役立ちます。 IronPDF は無料トライアルを提供しており、ライセンスは$799から始まります。 これにより、PDF の編集、圧縮、およびセキュリティなどの完全な機能にアクセスできます。
よくある質問
C# で HTML を PDF に変換するにはどうすればいいですか?
IronPDF の RenderHtmlAsPdf メソッドを使用して、HTML 文字列を PDF に変換できます。RenderHtmlFileAsPdf を使用して HTML ファイルを PDF に変換することもできます。
C#におけるinitキーワードの目的は何ですか?
initキーワードは、オブジェクトの初期化時にのみ設定でき、その後は変更されないプロパティを定義することを可能にします。この機能は、一度作成した後に変更されるべきでないオブジェクトを作成するのに特に役立ちます。
C#でinitキーワードはどのようにオブジェクトの不変性を強化しますか?
initキーワードにより、オブジェクトの初期化段階のみでプロパティを設定することができ、その後の変更を防ぎます。これにより、オブジェクトが作成された後は不変であることが保証されます。
initプロパティはPDF生成用のライブラリと一緒に使えますか?
はい、initプロパティはIronPDFのようなライブラリと一緒に使用して、不変オブジェクトからPDFを生成することができ、PDFに使用されるデータがプロセス全体で一貫していることを保証します。
initキーワードを伝統的なsetterよりも使用することの利点は何ですか?
initキーワードを使用することで、伝統的なsetterよりも不変性を促進し、長いコンストラクタコードの必要性を減らし、オブジェクトのプロパティが初期化後に変更されないようにします。
C#で不変プロパティを使用したPDF生成をどのように統合できますか?
initプロパティを使用して不変オブジェクトを作成し、これらのオブジェクトをIronPDFに渡して、一貫性があり信頼できるPDFドキュメントを生成することができます。
initキーワードは、現代のC# アプリケーションの作成にどのような役割を果たしますか?
initキーワードは、開発者が簡潔な構文で不変オブジェクトを定義できるようにすることで、コードの安全性を高め、バグを減少させ、現代のC#アプリケーションの作成に重要な役割を果たします。
C#プロジェクトでPDF生成ライブラリをどうやってインストールできますか?
NuGetパッケージマネージャを使用して、コマンドInstall-Package IronPdfを使ってC#プロジェクトにIronPDFのようなライブラリをインストールできます。
なぜアプリケーション開発において不変性が重要ですか?
不変性は、データの整合性と一貫性をアプリケーション全体で保証するため重要であり、メンテナンスが容易になり、バグの可能性が減少します。
initキーワードの使用を示す実践的な例にはどのようなものがありますか?
実践的な例として、プロパティが初期化時にのみ設定されるクラスを定義するためにinitキーワードを使用します。これにより、データの一貫性が重要なシナリオで役立つ、不変のオブジェクトが生成されます。








