.NET ヘルプ

C# レコードとクラス (開発者にとっての仕組み)

公開済み 2024年8月11日
共有:

C#の世界では、データをモデル化しカプセル化するために、主に二つの構造が利用されます:クラス以下のコンテンツを日本語に翻訳してください:レコード. どちらも参照型として機能しますが、その用途、動作、および平等性の取り扱い方法に大きな違いがあります。 このガイドでは、これらの違いを詳しく解説し、明確な例と実用的な利用方法を提供して、開発者が自分のニーズに適した構造を選択する際の助けとなるよう努めます。 についても学ぶ。IronPDFライブラリ.

C#のクラス:基本

クラスはデータと動作をカプセル化するために設計された、C#におけるオブジェクト指向プログラミングの礎となる存在です。 それらは参照型であり、同じ値を持つ2つのクラスインスタンスは別々のオブジェクトと見なされます。 この区別は、二つのクラスインスタンスを比較する際に重要です。 デフォルトの比較は値ベースではなく、参照ベースです。

public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
Public Class Person
	Public Property Id() As Integer
	Public Property FullName() As String
End Class
VB   C#

上記の例では、PersonId および FullName プロパティを持つクラスです。 たとえ2つのPersonインスタンスが同一のIdおよびFullName値を持っていても、それらはメモリ内にある2つの異なる参照であるため、デフォルトでは等しいとは見なされません。

C#のレコード:イミュータブルデータ構造

C#に導入されたレコード型は、不変データ構造の作成を簡素化し、従来のクラス構造に対する堅牢な代替手段を提供するための新しい追加機能です。 クラスとは異なり、レコードは値ベースの等価性セマンティクスを提供するため、データ転送オブジェクトや挙動がほとんどない小規模なデータ構造に最適です。

public record Person(int Id, string FullName);
public record Person(int Id, string FullName);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string FullName)
VB   C#

上記の例では、レコード定義がより簡潔になり、定型コードが削減されています。 レコードは自動的に非破壊変異および値に基づく比較をサポートします。 同じ値を持つ2つのレコードインスタンスは、値のセマンティクスに従って等しいと見なされます。

実用的な使用例: Record と Class を使うタイミング

クラスとレコード、またはC#の他のデータ構造の間で選択することは、モデリングするデータの複雑さとアプリケーションによって求められる動作に依存します。 クラスは複雑なデータ構造に特化して設計されており、動作を取り入れるように設計されています。(メソッド)要求に応じてミュータブルなインスタンスを許可します。 一方、レコードはシンプルなデータ構造の完璧な例であり、不変の特性と値ベースの平等性を備えて設計されており、作成後にデータが変わらない場合に最適です。

データ構造がデータと動作をカプセル化する必要がある場合、または作成後にデータを操作する必要がある場合、クラスは理想的です。 この柔軟性により、クラスは多くの従来のオブジェクト指向プログラミングシナリオや複雑なデータ構造を作成する際の定番となっています。

データの不変性が重要なシナリオや、主にデータコンテナとして機能する単純なデータ構造を扱う場合において、Recordsは非常に役立ちます。 それらの組み込みの値ベースの等価性と簡潔な構文により、データ転送オブジェクトや値オブジェクトに最適です。

値型と参照型

C#での値型と参照型の違いを理解することは重要です。 クラスは参照型であり、変数はメモリ内の実際のデータへの参照を保持します。 この特性により、デフォルトの参照ベースの等値比較が行われます。

レコードは参照型でありながら、組み込みの値ベースの等価性を通じて値セマンティクスを模倣し、比較において値型のように振る舞います。

コード例: クラスとレコードの実装

クラスとレコードを実装して、構文と動作の違いを強調してみましょう。

クラス実装:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
Public Class Product
	Public Property Id() As Integer
	Public Property Name() As String

	Public Sub New(ByVal id As Integer, ByVal name As String)
		Me.Id = id
		Me.Name = name
	End Sub
End Class
VB   C#

レコード実装:

public record Product(int Id, string Name);
public record Product(int Id, string Name);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Product(int Id, string Name)
VB   C#

レコード実装の簡潔さとシンプルさに注目してください。 レコードは、自動的にコンストラクター、プロパティ、および値に基づく等価性のためのメソッドを生成します。

等価性の理解:参照と値

C# のクラス型とレコード型の核心的な違いは、実際にそれらが平等性をどのように扱うかにあります。

  1. クラスはデフォルトで参照の等価性を使用します。つまり、同じメモリ位置を指している場合、2つのインスタンスは等しいと見なされます。

  2. レコードはデフォルトで値の等価性を使用し、プロパティが同じ値を持つ場合に2つのインスタンスを等しいと見なします。

    参照等価の例(クラス)**

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
Public Class Person
	Public Property Id() As Integer
	Public Property Name() As String
End Class

Private classInstance1 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Private classInstance2 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Console.WriteLine(classInstance1 = classInstance2) ' Outputs: False
VB   C#

同じプロパティ値を持つクラスのインスタンスが2つ存在しても、それらはメモリ上で異なるオブジェクトであるため、等しいとは見なされません。

値の等価性の例

public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string Name)

Private recordInstance1 = New Person(1, "Iron Software")
Private recordInstance2 = New Person(1, "Iron Software")
Console.WriteLine(recordInstance1 = recordInstance2) ' Outputs: True
VB   C#

同じプロパティ値を持つレコードの2つのインスタンスは、デフォルトでは等しいと見なされます。

高度な機能:レコード

レコードは、不変データ構造や値ベースの等価性のニーズに応えるためのいくつかの高度な機能を備えています。 with 式を使用すると、既存のレコードをコピーして新しいレコードインスタンスを作成し、一部のプロパティを変更することができます。これは非破壊的な変更を示しています。

レコードによる非破壊的変異:

var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
Dim originalRecord = New Person(1, "Doe")
'INSTANT VB TODO TASK: C# 'with expressions' are not converted by Instant VB:
'var modifiedRecord = originalRecord with { Name = "Iron Developer" }
VB   C#

この機能は不変データ構造を扱う際に便利であり、元のデータを変更することなくインスタンスを「変更」する方法を提供します。

IronPDFライブラリの紹介

IronPDFウェブページ

IronPDFは、.NET開発者向けのPDFライブラリであり、.NETアプリケーション内でPDF文書の作成、編集、管理を直接行うための包括的なソリューションを提供します。 それは、開発者がPDF生成プロセスを簡素化することを可能にします。**HTMLをPDFに変換、CSS、JavaScript、および画像をPDFに変換します。 IronPDFはさまざまな.NETフレームワークとプロジェクトタイプをサポートしており、Web、デスクトップ、およびコンソールアプリケーションを含み、Windows、Linux、およびmacOSなどの複数のオペレーティングシステムに対応しています。

PDFの作成だけでなく、IronPDFはPDFの編集、プロパティとセキュリティの設定、PDFフォームの操作、およびコンテンツの抽出機能を提供します。 これは、.NETプロジェクトにPDF機能を統合するための信頼できるツールを探している開発者のニーズを満たすように設計されています。

コード例

IronPDFを使用してC#でPDFを作成するには、クラスとレコードの両方を使用できます。 以下に、シンプルなPDFドキュメントを生成するための2つのアプローチの例を示します。 C#におけるクラスとレコードの主な違いは、その使用目的にあります。クラスはデフォルトで変更可能であり、従来のオブジェクト指向プログラミングに適しています。一方、レコードは不変であり、値ベースのプログラミングに設計されているため、データモデリングに最適です。

クラスを使用する

次の例では、与えられたHTML文字列からPDFを作成するメソッドを含む PdfGenerator クラスを定義します。

using IronPdf;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
using IronPdf;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
Imports IronPdf

Public Class PdfGenerator
	Public Property HtmlContent() As String

	Public Sub New(ByVal htmlContent As String)
		Me.HtmlContent = htmlContent
	End Sub

	Public Sub GeneratePdf(ByVal filePath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent)
		pdfDocument.SaveAs(filePath)
	End Sub
End Class

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"

		Dim generator = New PdfGenerator("<h1>Hello, World from Class!</h1>")
		generator.GeneratePdf("ClassExample.pdf")
	End Sub
End Class
VB   C#

出力:

クラスの例から出力されたPDF

レコードの使用

対照的に、C#のレコードは初期化後にイミュータブルです。 以下に示すのは、with式を使用してレコードを修正し、目的の変更を加えた新しいインスタンスを返すことで同様の結果を達成する方法です。

using IronPdf;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
using IronPdf;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
Imports IronPdf

'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record PdfGeneratorRecord(string HtmlContent)
'{
'	public void GeneratePdf(string filePath)
'	{
'		var renderer = New ChromePdfRenderer();
'		var pdfDocument = renderer.RenderHtmlAsPdf(Me.HtmlContent);
'		pdfDocument.SaveAs(filePath);
'	}
'}

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"

		Dim recordGenerator = New PdfGeneratorRecord("<h1>Hello, World from Record!</h1>")
		recordGenerator.GeneratePdf("RecordExample.pdf")
	End Sub
End Class
VB   C#

出力:

レコード例から出力されたPDF

以下の例は、C#のクラスとレコードの両方を使用してIronPDFでPDFファイルを生成する方法を示しています。 クラスとレコードのどちらを使用するかの選択は、特定のニーズによって異なります。もし作成後にオブジェクトが変更される必要がある場合は、クラスの方が適しているかもしれません。 作成後に変更すべきでないデータを扱っている場合や、不変性の構文的な簡潔さと安全性を重視する場合、record(レコード)がより適切な選択肢となるでしょう。

結論

IronPDFライセンスページ

結論として、クラスは変更可能な状態と参照ベースの等価性を備えた伝統的なオブジェクト指向の機能を提供する一方で、レコードは値ベースの等価性を持った不変データ構造を定義するための現代的なアプローチを提供します。

クラスとレコードの選択は、アプリケーションの特定の要件に基づいて判断する必要があります。考慮すべき要素には、不変性の必要性、データ構造の複雑さ、および平等比較の好ましい方法が含まれます。 IronPDFの無料トライアルをご覧ください。.NETアプリケーションにPDF機能を統合したいと考えている方は、ライセンスは$749からご利用いただけます。

< 以前
C#スリープ(開発者向けの動作方法)
次へ >
MySqlclient C#(開発者への使い方)