フッターコンテンツにスキップ
.NETヘルプ

C# Record Vs Class(開発者向けの動作方法)

In the world of C#, two primary structures are utilized to model and encapsulate data: classes and records. どちらも参照型として機能しますが、その意図された使用方法、動作、および平等の取り扱いにおいて大きく異なります。 このガイドではこれらの違いを解剖し、開発者がニーズに合った適切な構造を選択できるように、明確な例と実際の使用法を提供します。 また、IronPDFライブラリについても学びます。

C#におけるクラス: 基本

クラスは、C#におけるオブジェクト指向プログラミングの礎となるもので、データと動作をカプセル化するために設計されています。 クラスは参照型であり、同じ値を持つ2つのクラスインスタンスは別々のオブジェクトと見なされます。 この区別は、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
$vbLabelText   $csharpLabel

上記の例では、PersonIdFullNameプロパティを持つクラスです。 たとえ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)
$vbLabelText   $csharpLabel

上記の例では、レコードの定義はより簡潔であり、ボイラープレートコードを削減します。 レコードは自動的に破壊的でない変異と値ベースの比較をサポートします。 同じ値を持つ2つのレコードインスタンスは、値セマンティクスと一致するものとして等しいと見なされます。

実用的な使用: レコードとクラスの使い分け

C#でクラスやレコード、その他のデータ構造のどれを選ぶかは、モデル化しているデータの複雑さやアプリケーションが必要とする動作に依存します。 クラスは、複雑なデータ構造に特化して設計され、動作(メソッド)を取り込むことができ、必要に応じて可変なインスタンスを許可します。 一方で、レコードは簡素なデータ構造の完璧な例であり、不変の特性と値ベースの平等を取り入れ、作成後に一定のままであるデータに最適です。

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

レコードは、データの不変性が重要な場合や、主にデータコンテナとして機能する簡単なデータ構造を扱う場合に輝きます。 レコードの組み込みの値ベースの平等と簡潔な構文は、データ転送オブジェクトや値オブジェクトに最適です。

値型と参照型

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
$vbLabelText   $csharpLabel

レコードの実装:

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)
$vbLabelText   $csharpLabel

レコードの実装の簡潔さと単純さに注目してください。 レコードは自動的にコンストラクタ、プロパティ、および値ベースの平等を保証するためのメソッドを生成します。

平等の理解: 参照対値

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
$vbLabelText   $csharpLabel

同じプロパティ値を持つクラスの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
$vbLabelText   $csharpLabel

同じプロパティ値を持つレコードの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" }
$vbLabelText   $csharpLabel

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

IronPDFライブラリの紹介

IronPDFウェブページ

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

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

コード例

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

クラスの使用

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

using IronPdf;
using System;

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"; // Set your license key here

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

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"; // Set your license key here

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

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" ' Set your license key here

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

出力:

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

レコードの使用

対照的に、C#のレコードは初期化後は不変です。 必要な変更を適用した新しいレコードインスタンスを返すwith式を利用して、レコードで同様の結果を達成する方法を示します。

using IronPdf;
using System;

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"; // Set your license key here

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

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"; // Set your license key here

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

'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" ' Set your license key here

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

出力:

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

これらの例は、C#でIronPDFを使用してクラスとレコードの両方を使い、PDFファイルを生成する方法を示しています。 クラスを使用するかレコードを使用するかの選択は、あなたの特定のニーズによります。作成後にオブジェクトを変更する必要がある場合、クラスがより適しているかもしれません。 作成された後にデータが変更されるべきではないか、もしくは不変性の構文的単純さと安全性を気に入るのであれば、レコードがより良い選択である可能性があります。

結論

IronPDFライセンシングページ

結論として、クラスはミュータブルな状態と参照ベースの平等を持つ伝統的なオブジェクト指向の特徴を提供し、レコードは値ベースの平等を持つ不変データ構造を定義するための現代的なアプローチを提供します。

クラスを使用するかレコードを使用するかの選択は、アプリケーションの特定の要求に基づいて行うべきであり、不変性の必要性、データ構造の複雑さ、および好ましい平等比較方法などの要因を考慮します。 IronPDFの無料トライアルを発見してくださいは、.NETアプリケーションにPDF機能を統合しようとしている方にライセンスを提供し、$799から始まります。

よくある質問

C# クラスとレコードの主な違いは何ですか?

C# クラスとレコードは共に参照型であり、データをモデリングおよびカプセル化するために使用されますが、平等性と不変性の扱い方に違いがあります。クラスは参照平等性を使用し、同じメモリ位置を指している場合、2つのインスタンスは等しいとみなされます。一方、レコードは値平等性を使用し、プロパティが同じ値を持っている場合、2つのインスタンスが等しいとみなされ、デフォルトで不変となるよう設計されています。

C# でクラスまたはレコードを使用するかどうかはどう決めることができますか?

C# においてクラスまたはレコードを使用する選択は、具体的な要件に依存します。インスタンスを可変にする必要がある場合や、オブジェクト指向プログラミングで一般的なデータや動作のカプセル化を行いたい場合にクラスを使用します。構造が単純で、不変で、値ベースの平等性が必要な場合は、データ転送オブジェクトのようなレコードを選択します。

IronPDF ライブラリは .NET での PDF 生成をどのようにサポートしますか?

IronPDF は .NET 用の強力な PDF ライブラリであり、PDF ドキュメントの作成、編集、管理を簡単にします。開発者は HTML、CSS、JavaScript、画像を PDF に変換でき、さまざまな .NET フレームワークとオペレーティングシステムをサポートし、.NET 開発者にとって不可欠なツールです。

PDF 生成プロジェクトで C# クラスとレコードの両方を使用できますか?

はい、PDF 生成プロジェクトで C# クラスとレコードの両方を使用できます。選択は論理のために可変または不変のデータ構造を必要とするかどうかによります。たとえば、IronPDF はどちらの構造でもシームレスに動作し、PDF を生成および操作できます。

C# レコードにおける不変性の役割は何ですか?

不変性は C# レコードのコア機能です。一度作成されると、レコードのプロパティは変更できません。これは値ベースの平等性のセマンティクスと一致します。この設計により、データ転送オブジェクトのような状況でデータの一貫性と整合性が重要視される場合にレコードが理想的となります。

IronPDF は .NET アプリケーション向けの PDF 機能をどのように強化しますか?

IronPDF は HTML から PDF への変換、PDF の編集、ドキュメントセキュリティの管理などの機能を提供することで .NET アプリケーション向けの PDF 機能を強化します。フォームの操作、コンテンツの抽出、およびさまざまな .NET 環境でのシームレスな統合をサポートし、PDF ドキュメントの処理を合理化します。

C# レコードの『with』式とは何ですか?

C# レコードの『with』式は非破壊的変更のために使用されます。開発者が既存のレコードインスタンスをコピーし、一部のプロパティを変更した新しいインスタンスを作成することを可能にし、元のデータを変更されないままにします。

レコードはなぜデータ転送オブジェクトに適していると考えられますか?

レコードは不変の構造を定義するための簡潔なシンタックスを提供し値ベースの平等性を実現するため、データ転送オブジェクトに適していると考えられます。これによりデータの整合性が維持され、同一の値を持つインスタンスが等しいとして扱われることが確保されます。これはデータ転送のシナリオでよく求められる特性です。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。