.NET ヘルプ

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

公開済み 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.
Public Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
End Class
Private person = New Person With {
	.FirstName = "Iron",
	d LastName = "Dev"
}
' person.FirstName = "Jane";  // This will give a compile-time error.
VB   C#

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"
};
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"
}
VB   C#

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
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
VB   C#

これにより、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
VB   C#

コンストラクタと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;
    }
}
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
VB   C#

このアプローチは有効ですが、プロパティを初期化するためにコンストラクタの定型コードが必要になります。 また、クラス自体が後でプロパティを変更できるようにしますが、これは不変オブジェクトにとっては必ずしも理想的ではありません。 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;
    }
}
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
VB   C#

初期化のための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; }
}
Public Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
End Class
VB   C#

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
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

以下はコード例です:

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
VB   C#

結論

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

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

< 以前
FileStream C# (開発者のための仕組み)
次へ >
C#セマフォスリム(開発者のための仕組み)