ライブ環境でテストする
ウォーターマークなしで本番環境でテストしてください。
必要な場所でいつでも動作します。
についてinit キーワードC# 9.0では、不変オブジェクトを作成するためのクラスプロパティを定義する新しい方法が導入されました。 C#の以前のバージョンでは、プロパティは通常、オブジェクトフィールドからの読み取りとオブジェクトフィールドへの書き込みのためのアクセサを取得および設定するために使用されていました。 ただし、initでは、オブジェクトの初期化時のみ書き込み可能なプロパティを作成し、その後は読み取り専用にすることができます。
このチュートリアルでは、C# initキーワードの使用方法について、実践的な例やシナリオを交えて説明します。IronPDFライブラリ. また、従来のプロパティ・セッタの決定的な違いについても学びます。(セット)そして、新しいinit-onlyセッター。
基本的な例から見ていきましょう:
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.
この例では、FirstNameとLastNameはinit-onlyプロパティとしてマークされています。 これは、オブジェクトのイニシャライザ中にのみ割り当てることができることを意味します。 オブジェクトが作成された後、値を変更しようとすると、コンパイル時にエラーが発生します。
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の使用は、オブジェクトのイニシャライザとシームレスに動作します。 コンストラクタに依存して値を設定する代わりに、オブジェクトを作成するときに必要なプロパティを直接定義することができます。
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
これにより、Point 型のシンプルで不変なオブジェクトが作成されます。 XとYの値は初期化時に設定され、後で変更できないことに注意してください。
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アクセサを使用していました。
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プロパティを使用する方法の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
別の方法として、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
IronPDFは、C#開発者向けに設計された強力なPDF生成・操作ライブラリです。 これはHTMLを変換したPDFCSS、画像、その他のコンテンツをPDF文書に変換。 ピクセルパーフェクトレンダリング、クロスプラットフォームサポート、.NETプロジェクトへの簡単な統合などの機能により、IronPDFは高品質のPDFを素早く作成する必要がある開発者にとって理想的です。 .NET Core、.NET Framework、.Standardで使用でき、Windows、Linux、macOSを含む幅広いプラットフォームに対応しています。
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
以下はコード例です:
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キーワードを使用すると、オブジェクトの初期化時に柔軟性を提供しながら、不変オブジェクトを作成できます。 これは、コンストラクタの定型コードの必要性を減らし、プライベート・セット・アクセサに代わる、よりクリーンで安全な方法です。 initキーワードを読み取り専用のフィールド、構造体、および検証ロジックと組み合わせることで、可読性や柔軟性を犠牲にすることなく不変性を保持する堅牢で安全なデータ構造を構築することができます。 IronPDFは無料体験ライセンスは$749からです。 これにより、PDFの編集、圧縮、セキュリティ保護など、その全機能にアクセスできるようになります。
9つの .NET API製品 オフィス文書用