フッターコンテンツにスキップ
.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.
$vbLabelText   $csharpLabel

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

この例では、FirstNameLastName が init-only プロパティとしてマークされています。 これは、オブジェクトの初期化時だけに代入できることを意味します。 オブジェクトが作成された後、値を変更しようとするとコンパイル時エラーになります。

なぜ 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"
};
$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
$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;
    }
}
$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;
    }
}
$vbLabelText   $csharpLabel

このアプローチは機能しますが、プロパティを初期化するためにコンストラクターボイラープレートコードが必要です。 また、クラス自体が後でプロパティを変更できるようになるため、必ずしもイミュータブルなオブジェクトに理想的であるとは限りません。 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;
    }
}
$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; }
}
$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);
    }
}
$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)

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

彼の主要なIronPDFとIron Suite .NETライブラリは、世界中で3000万以上のNuGetインストールを達成し、彼の基礎となるコードは世界中で使用されている開発者ツールに力を与え続けています。25年の商業経験と41年のコーディングの専門知識を持つJacobは、次世代の技術リーダーを指導しながら、エンタープライズグレードのC#、Java、Python PDFテクノロジーにおけるイノベーションの推進に注力しています。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me