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

C# Primary Constructor (開発者向けの仕組み)

C#プログラミングのオブジェクト指向の世界では、プライマリコンストラクタの導入により、言語に新たな優雅さとシンプルさがもたらされます。 プライマリコンストラクタは、インターセプターやコレクション式などの機能と共に、C# 12に登場し、パラメータ付きのコンストラクタを宣言するためのより簡潔な構文を提供する強力な機能です。 プライマリコンストラクタについて詳しくは、Microsoft C#ガイドで探索できます。

この記事では、C# 12のプライマリコンストラクタを効率的に使用する方法を学び、その機能性、使用例、およびクラスの初期化アプローチの変革を探ります。

基礎の理解: C#のコンストラクタ

コンストラクタは、オブジェクト指向プログラミングで重要な役割を担っており、オブジェクトの初期化のための設計図として機能します。 伝統的に、C#の開発者は、デフォルトコンストラクタやパラメータ付きコンストラクタを使用して、クラスの初期状態を設定してきました。 しかし、プライマリコンストラクタの導入により、このC#開発の重要な側面に対するより合理化されたアプローチが追加されました。

プライマリコンストラクタの本質

C#におけるプライマリコンストラクタは、クラス宣言内でプロパティを直接宣言および初期化する簡潔な方法です。 プロパティの定義と値の割り当てのプロセスを簡素化し、より宣言的で読みやすい構文を提供します。

プライマリコンストラクタの利点

  1. 簡潔さ: プライマリコンストラクタは、ボイラープレートコードを削減し、可読性を向上させる簡明な構文を提供します。
  2. スコープ: 従来のコンストラクタとは異なり、プライマリコンストラクタのパラメータはクラス全体や構造体全体でスコープを持っており、柔軟に使用できます。
  3. デフォルト値: デフォルトパラメータ値はオブジェクトの作成を簡素化し、開発者にとってより便利になります。

プライマリコンストラクタの宣言

プライマリコンストラクタの構文は、クラスヘッダーでプロパティを直接宣言することを含みます。 基本的なPersonクラスの例を考えてみましょう。

public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;
    public override string ToString() => $"Name: {Name}, Age: {Age}";
}
public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;
    public override string ToString() => $"Name: {Name}, Age: {Age}";
}
Public Class Person(String name, Integer age)
	Public ReadOnly Property Name() As String = name
	Public ReadOnly Property Age() As Integer = age
	Public Overrides Function ToString() As String
		Return $"Name: {Name}, Age: {Age}"
	End Function
End Class
$vbLabelText   $csharpLabel

上記のコードスニペットでは、Personクラスがプライマリコンストラクタを持ち、インスタンスメンバーNameおよびインスタンスメンバーAgeプロパティを初期化しています。 コンストラクタのパラメータはクラスまたは構造体名と共に宣言され、パブリックプロパティを定義する際に、パラメータ値がそれらに割り当てられます。

例1: 2D空間の不変のポイント

public readonly struct Point(double x, double y)
{
    public double X { get; } = x;
    public double Y { get; } = y;
    public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
public readonly struct Point(double x, double y)
{
    public double X { get; } = x;
    public double Y { get; } = y;
    public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct Point(double x, double y)
Public Structure Point(Double x, Double y)
	Public ReadOnly Property X() As Double = x
	Public ReadOnly Property Y() As Double = y
	Public ReadOnly Property Magnitude() As Double
		Get
			Return Math.Sqrt(X * X + Y * Y)
		End Get
	End Property
End Structure
$vbLabelText   $csharpLabel

この例では、Point構造体のプライマリコンストラクタがXおよびYプロパティを初期化し、構文の簡潔さと表現力を示しています。

例2: デフォルト設定のある設定可能なログ機能

public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
    private readonly string _filePath = filePath;
    private readonly LogLevel _level = level;

    public void Log(string message)
    {
        // Actual logging implementation using _filePath and _level
    }
}
public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
    private readonly string _filePath = filePath;
    private readonly LogLevel _level = level;

    public void Log(string message)
    {
        // Actual logging implementation using _filePath and _level
    }
}
'INSTANT VB TODO TASK: The following line contains an assignment within expression that was not extracted by Instant VB:
'ORIGINAL LINE: public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
Public Class Logger(String filePath = "log.txt", LogLevel level = LogLevel.Info)
	Private ReadOnly _filePath As String = filePath
	Private ReadOnly _level As LogLevel = level

	Public Sub Log(ByVal message As String)
		' Actual logging implementation using _filePath and _level
	End Sub
End Class
$vbLabelText   $csharpLabel

ここでは、LoggerクラスのプライマリコンストラクタがfilePathおよびlevelにデフォルト値を提供し、設定可能性を維持しつつ、柔軟かつ簡単に利用可能にしています。

例3: 依存関係の注入

public interface IService
{
    Distance GetDistance();
}

public class ExampleController(IService service) : ControllerBase
{
    public ActionResult<Distance> Get() => service.GetDistance();
}
public interface IService
{
    Distance GetDistance();
}

public class ExampleController(IService service) : ControllerBase
{
    public ActionResult<Distance> Get() => service.GetDistance();
}
Public Interface IService
	Function GetDistance() As Distance
End Interface

Public Class ExampleController(IService service)
	Inherits ControllerBase

	Public Function [Get]() As ActionResult(Of Distance)
		Return service.GetDistance()
	End Function
End Class
$vbLabelText   $csharpLabel

プライマリコンストラクタは依存関係の注入シナリオに適しています。 この例では、コントローラクラスが依存関係を指示し、保守性を向上し、ユニットテストを容易にします。

例4: 幾何学的形状階層の構築

public abstract class Shape(double width, double height)
{
    public double Width { get; } = width;
    public double Height { get; } = height;
    public abstract double CalculateArea();
}

public class Rectangle(double width, double height) : Shape(width, height)
{
    public override double CalculateArea() => Width * Height;
}

public class Circle : Shape
{
    public Circle(double radius) : base(radius * 2, radius * 2) { }
    public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
public abstract class Shape(double width, double height)
{
    public double Width { get; } = width;
    public double Height { get; } = height;
    public abstract double CalculateArea();
}

public class Rectangle(double width, double height) : Shape(width, height)
{
    public override double CalculateArea() => Width * Height;
}

public class Circle : Shape
{
    public Circle(double radius) : base(radius * 2, radius * 2) { }
    public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
Public MustInherit Class Shape(Double width, Double height)
	Public ReadOnly Property Width() As Double = width
	Public ReadOnly Property Height() As Double = height
	Public MustOverride Function CalculateArea() As Double
End Class

Public Class Rectangle(Double width, Double height)
	Inherits Shape(width, height)

	Public Overrides Function CalculateArea() As Double
		Return Width * Height
	End Function
End Class

Public Class Circle
	Inherits Shape

	Public Sub New(ByVal radius As Double)
		MyBase.New(radius * 2, radius * 2)
	End Sub
	Public Overrides Function CalculateArea() As Double
		Return Math.PI * Math.Pow(Width / 2, 2)
	End Function
End Class
$vbLabelText   $csharpLabel

この例では、Shapeクラスのプライマリコンストラクタが幾何学的形状階層の基盤を形成しています。 サブクラスのRectangleおよびCircleは一貫した初期化のためにプライマリコンストラクタを活用しています。 Rectangleクラス自体がプライマリコンストラクタを宣言し、プライマリコンストラクタパラメータをShapeクラスのプライマリパラメータに渡します。 Circleクラスはクラス全体内でコンストラクタを定義し、baseキーワードを使用してそのパラメータをShapeコンストラクタのデフォルト値として渡すことで柔軟性を示しています。

IronPDFの紹介

IronPDFは、開発者がPDFファイルを簡単に作成、操作、変換できる多用途なC#ライブラリです。 請求書、レポート、その他のドキュメントを生成しているかどうかに関わらず、IronPDFを使用すると、C#アプリケーション内でHTMLコンテンツを洗練されたプロフェッショナルなPDFにシームレスに変換できます。

IronPDFは開発者にとって便利なツールで、ウェブページ、URL、HTMLをPDF に変換できます。 最も良い点は、PDFがオリジナルのウェブページのままであり、すべてのフォーマットとスタイルが保持されることです。 ウェブコンテンツ、レポート、請求書からPDFを作成するのに最適です。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

C#プライマリコンストラクタ (開発者がどのように動作するか): 図1 - IronPDFウェブページ

IronPDFのインストール:クイックスタート

C#プロジェクトにIronPDFを組み込むには、まずIronPDF NuGetパッケージをインストールします。 パッケージマネージャコンソールで次のコマンドを実行します。

Install-Package IronPdf

または、NuGetパッケージマネージャで"IronPDF"を見つけ、そこからインストールを続行します。

C#プライマリコンストラクタ (開発者がどのように動作するか): 図2 - NuGetパッケージマネージャブラウザでIronPDFパッケージを検索

IronPDFでPDFを生成

IronPDFを使用してPDFを作成するプロセスは合理化されています。 次の例を考えてみましょう。

var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
' Create a new PDF document
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
$vbLabelText   $csharpLabel

この例では、IronPDFを利用してHTMLコンテンツをPDFドキュメントにレンダリングし、指定された場所に保存します。 For more details on creating and manipulating PDFs in C#, please visit this complete tutorial link, and to explore more please visit this documentation page.

C#プライマリコンストラクタ: クラス初期化の革命

C#プライマリコンストラクタは、クラス宣言内でクラスプロパティを初期化するための宣言的で合理化されたアプローチを提供します。 この優雅な機能がIronPDFとスムーズに統合できるかどうか探ってみましょう。

C#プライマリコンストラクタとIronPDFの統合

C#プライマリコンストラクタが主にクラス初期化に焦点を当てた言語機能である一方で、それらがIronPDFと直接統合するのは一般的な使用ケースではないかもしれません。 IronPDFのコア機能はPDFドキュメントの生成と操作にあり、クラス初期化の詳細とは直接的に一致しないかもしれません。

ただし、IronPDF構成やデータモデルに関連するカスタムクラスや構造体を定義する際には、C#プライマリコンストラクタを利用できます。 たとえば、特定のクラス構造がPDF関連設定や構成を管理するために必要な場合、C#プライマリコンストラクタはこれらのクラスを簡潔に初期化するための貴重なツールとなります。

public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
    public string Title { get; } = title;
    public bool IncludeHeader { get; } = includeHeader;
    public bool IncludeFooter { get; } = includeFooter;
    // Additional properties...
}

// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions
{
    PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
    MarginTop = 20,
    MarginBottom = 20,
    MarginLeft = 10,
    MarginRight = 10,
    Title = pdfSettings.Title
};
// Apply settings from PdfGenerationSettings
if (pdfSettings.IncludeHeader)
{
    renderOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
    public string Title { get; } = title;
    public bool IncludeHeader { get; } = includeHeader;
    public bool IncludeFooter { get; } = includeFooter;
    // Additional properties...
}

// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions
{
    PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
    MarginTop = 20,
    MarginBottom = 20,
    MarginLeft = 10,
    MarginRight = 10,
    Title = pdfSettings.Title
};
// Apply settings from PdfGenerationSettings
if (pdfSettings.IncludeHeader)
{
    renderOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
Public Class PdfGenerationSettings(String title, Boolean includeHeader, Boolean includeFooter)
	Public ReadOnly Property Title() As String = title
	Public ReadOnly Property IncludeHeader() As Boolean = includeHeader
	Public ReadOnly Property IncludeFooter() As Boolean = includeFooter
	' Additional properties...
End Class

' Usage with IronPDF
Private pdfSettings = New PdfGenerationSettings("My PDF Title", True, False)
Private renderOptions = New ChromePdfRenderOptions With {
	.PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
	.MarginTop = 20,
	.MarginBottom = 20,
	.MarginLeft = 10,
	.MarginRight = 10,
	.Title = pdfSettings.Title
}
' Apply settings from PdfGenerationSettings
If pdfSettings.IncludeHeader Then
	renderOptions.TextHeader = New TextHeaderFooter With {
		.CenterText = "Page {page} of {total-pages}",
		.DrawDividerLine = True
	}
End If
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderingOptions = renderOptions
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf")
$vbLabelText   $csharpLabel

この例では、PdfGenerationSettingsクラスがPDF生成設定に関連するプロパティを初期化するためにC#プライマリコンストラクタを利用しています。これは後に、どのレンダリングオプションを追加するか、何を省略するかを把握するために使用できます。出力にはヘッダーテキストと、プライマリコンストラクタパラメータを使用して設定されたタイトルが含まれます。

C#プライマリコンストラクタ (開発者がどのように動作するか): 図3 - 上記のコード例からの出力PDF

結論

結論として、C#のプライマリコンストラクタは、洗練され表現力豊かなクラス初期化アプローチを提示します。 その宣言的な構文はコードの可読性を向上させ、イミュータビリティを促進し、デフォルト値を使用したオブジェクトの作成プロセスを簡素化します。 プロパティを定義したり、イミュータビリティを強制したり、デフォルト値を採用したりする場合でも、プライマリコンストラクタはC#プログラミングのダイナミックな世界でのクラス初期化の技術を開発者に提供します。

C#プライマリコンストラクタのIronPDFとの直接統合が主な焦点でないかもしれませんが、これらの2つの要素は調和して機能することができます。 C#プライマリコンストラクタはクラス初期化の明確さと簡素さを高め、IronPDFのワークフローに関連する構造や構成を定義するのに価値があります。

強力なPDF生成のためにIronPDFの力を利用し、クラス初期化の優雅さが重要な場合にC#プライマリコンストラクタを採用しましょう。 このダイナミックなデュオは、C#プログラミングの多様な世界で創造力と効率をもってドキュメント生成の複雑さを導きます。

IronPDF offers a free trial and its lite license starts from $799.

よくある質問

プライマリコンストラクターがC#コードをどのように簡潔にするのか?

プライマリコンストラクターを使用すると、クラス宣言内で直接プロパティを宣言および初期化できるため、ボイラープレートコードが減少し、可読性が向上します。

C# 12に導入された新機能は何ですか?

C# 12はプライマリコンストラクター、インターセプター、およびコレクション式を導入し、開発者により簡潔で強力な構文オプションを提供します。

プライマリコンストラクターは不変のデータ構造で使用できますか?

はい、プライマリコンストラクターは不変のデータ構造に適しており、コンストラクター内で読み取り専用プロパティを直接初期化することができます。

HTML コンテンツを C# を使用して PDF に変換するにはどうすればよいですか?

ChromePdfRendererクラスを使用してHTMLコンテンツをPDFに変換し、出力ドキュメントでフォーマットとスタイリングを保持します。

PDF生成にIronPDFを使用する利点は何ですか?

IronPDFはC#でのPDFファイルの作成と操作のための堅牢なプラットフォームを提供し、HTMLからPDFへの変換、PDFのマージ、および詳細なスタイリングの保持などの機能をサポートします。

プライマリコンストラクターは依存性注入をどのように強化しますか?

プライマリコンストラクターは、コンストラクターパラメーターでクラスの依存関係を明確に示すことで依存性注入を強化し、依存関係グラフのセットアップと保守を簡素化します。

プライマリコンストラクターをPDFドキュメント生成とどのように統合できますか?

プライマリコンストラクターは、IronPDFのようなライブラリを使用した際にPDF設定に関連する構成クラスや構造を初期化するために使用でき、セットアッププロセスを合理化します。

プライマリコンストラクターの実用例は何ですか?

実用例には、幾何学的図形階層の初期化や明瞭さと簡潔さが重要な依存性注入シナリオが含まれます。

開発者が自分のプロジェクトでIronPDFを使用し始めるにはどうしたらよいですか?

開発者は、Package Manager ConsoleまたはNuGet Package Managerを通じてIronPDF NuGetパッケージをインストールし、実装の詳細について包括的なドキュメントを参照することができます。

IronPDFはドキュメント生成ワークフローでどのような役割を果たしますか?

IronPDFは、C#でのPDF作成、変換、および操作を容易にすることにより、ドキュメント生成ワークフローを向上させ、他のC#機能とのシームレスな統合をサポートします。

Curtis Chau
テクニカルライター

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

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