.NET ヘルプ

C# Init キーワード(開発者のための仕組み)

Kannaopat Udonpant
カンナパット・ウドンパント
2024年10月24日
共有:

についてinit キーワードC# 9.0では、不変オブジェクトを作成するためのクラスプロパティを定義する新しい方法が導入されました。 C#の以前のバージョンでは、プロパティは通常、オブジェクトフィールドからの読み取りとオブジェクトフィールドへの書き込みのためのアクセサを取得および設定するために使用されていました。 ただし、initでは、オブジェクトの初期化時のみ書き込み可能なプロパティを作成し、その後は読み取り専用にすることができます。

このチュートリアルでは、C# initキーワードの使用方法について、実践的な例やシナリオを交えて説明します。IronPDFライブラリ. また、従来のプロパティ・セッタの決定的な違いについても学びます。(セット)そして、新しいinit-onlyセッター。

Initキーワードの基本例

基本的な例から見ていきましょう:

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
var person = new Person
{
    FirstName = "Iron",d
    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",d
    LastName = "Dev"
};
// person.FirstName = "Jane";  // This will give a compile-time error.

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

この例では、FirstNameとLastNameは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"
};

Init-Onlyプロパティによるオブジェクトの初期化

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

これにより、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;
    }
}

コンストラクタとinitプロパティの両方を一緒に使うことができます。 このアプローチは、オブジェクト構築後の不変性を確保しつつ、より柔軟性があります。

プライベートセットに対するInitの利点

以前は、開発者はクラス外でのプロパティの変更を制限するために、private 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;
    }
}

このアプローチは有効ですが、プロパティを初期化するためにコンストラクタの定型コードが必要になります。 また、クラス自体が後でプロパティを変更できるようにしますが、これは不変オブジェクトにとっては必ずしも理想的ではありません。 initキーワードは、オブジェクトの作成時にのみ初期化を許可し、それ以降の変更をブロックするため、この問題を取り除きます。

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

init キーワードは、オブジェクトの作成時にフィールドやプロパティを初期化することができ、その後、それらは不変のままです。 読み取り専用フィールドは不変性を提供しますが、initアクセサはプロパティに同様の機能を提供します。 ここでは、読み取り専用フィールドを使用する方法とinitプロパティを使用する方法の2つの方法で不変性を処理する方法を説明します。

コンストラクタによる読み取り専用フィールドの使用

この例では、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;
    }
}

初期化のためのinitアクセサの使用

別の方法として、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; }
}

IronPDFの紹介

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

IronPDFは、C#開発者向けに設計された強力なPDF生成・操作ライブラリです。 これはHTMLを変換したPDFCSS、画像、その他のコンテンツをPDF文書に変換。 ピクセルパーフェクトレンダリング、クロスプラットフォームサポート、.NETプロジェクトへの簡単な統合などの機能により、IronPDFは高品質のPDFを素早く作成する必要がある開発者にとって理想的です。 .NET Core、.NET Framework、.Standardで使用でき、Windows、Linux、macOSを含む幅広いプラットフォームに対応しています。

ケースC#とIronPDFの使用; Initキーワード

C#プロジェクトでPDFを生成しながら不変オブジェクトを作成するには、initキーワードとIronPDFを組み合わせます。 IronPDFはデータを処理し、その不変モデルに基づいてPDFを生成します。

プロジェクト内でIronPDFが正しく参照されていることを確認してください。 NuGet経由でインストールできます:

Install-Package IronPdf
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);
    }
}

結論

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

要約すると、C# initキーワードを使用すると、オブジェクトの初期化時に柔軟性を提供しながら、不変オブジェクトを作成できます。 これは、コンストラクタの定型コードの必要性を減らし、プライベート・セット・アクセサに代わる、よりクリーンで安全な方法です。 initキーワードを読み取り専用のフィールド、構造体、および検証ロジックと組み合わせることで、可読性や柔軟性を犠牲にすることなく不変性を保持する堅牢で安全なデータ構造を構築することができます。 IronPDFは無料体験、ライセンスは $749 から始まります。 これにより、PDFの編集、圧縮、セキュリティ保護など、その全機能にアクセスできるようになります。

Kannaopat Udonpant
カンナパット・ウドンパント
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、カンナパットは日本の北海道大学から環境資源学の博士号を取得しました。学位を取得する過程で、カンナパットはバイオプロダクション工学部に所属する車両ロボティクス研究所のメンバーにもなりました。2022年には、C#のスキルを活かしてIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。カンナパットは、IronPDFで使用されているコードの大部分を作成した開発者から直接学べることに価値を見いだしています。同僚との学び合いに加えて、Iron Softwareで働くことの社会的側面も楽しんでいます。コードやドキュメントを書いていない時には、カンナパットは通常、PS5でゲームをしたり、『The Last of Us』を再視聴したりしています。
< 以前
FileStream C# (開発者のための仕組み)
次へ >
C#セマフォスリム(開発者のための仕組み)