フッターコンテンツにスキップ
.NETヘルプ

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.
$vbLabelText   $csharpLabel

C# Init キーワード(開発者のための仕組み):図 1 - プロパティが init のみとしてマークされているために発生する IDE エラー

この例では、FirstNameLastName が 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"
}
$vbLabelText   $csharpLabel

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 error
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 error
Public 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
$vbLabelText   $csharpLabel

これは Point 型の単純なイミュータブルなオブジェクトを作成します。 初期化時に XY の値が設定され、その後は変更できません。

コンストラクターとの 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
$vbLabelText   $csharpLabel

コンストラクターと 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
$vbLabelText   $csharpLabel

このアプローチは機能しますが、プロパティを初期化するためにコンストラクターボイラープレートコードが必要です。 また、クラス自体が後でプロパティを変更できるようになるため、必ずしもイミュータブルなオブジェクトに理想的であるとは限りません。 init キーワードは、この問題を解決します。オブジェクト作成時の初期化のみを許可し、その後の変更はブロックされます。

読み取り専用フィールドと Init アクセサーによる初期化の処理

init キーワードは、オブジェクト作成時にフィールドまたはプロパティを初期化し、その後イミュータブルのままにします。 読み取り専用フィールドはイミュータビリティを提供しますが、init アクセサーはプロパティに対して同様の機能を提供します。 ここでは、読み取り専用フィールドと init プロパティを使用してイミュータビリティを処理する方法を示します。

コンストラクターを用いた読み取り専用フィールドの使用

この例では、オブジェクト構築時に設定される firstNamelastName の読み取り専用フィールドを使用します。 これらのフィールドはコンストラクター内で一度だけ代入可能で、その後は変更できません。

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
$vbLabelText   $csharpLabel

イニット アクセサーによる初期化の使用

または、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 Class
$vbLabelText   $csharpLabel

IronPDFの紹介

C# Init キーワード(開発者のための仕組み):図 2 - IronPDF:C# PDF ライブラリ

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
$vbLabelText   $csharpLabel

結論

C# Init キーワード(開発者のための仕組み):図 3 - IronPDF ライセンスページ

要するに、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キーワードを使用します。これにより、データの一貫性が重要なシナリオで役立つ、不変のオブジェクトが生成されます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。