.NET ヘルプ

C# ジェネリクス(開発者向けの仕組み)

更新済み 4月 3, 2024
共有:

C# ジェネリクスは、クラス、メソッド、インターフェイス、およびデリゲートを設計するための方法を導入し、それらが管理するデータの型をパラメーターとして指定できます。 この概念は、ジェネリック型パラメータとして知られており、柔軟で再利用可能なコードコンポーネントの作成を可能にします。 使用することによって 総称型コードの再利用性、型安全性、およびパフォーマンスを最大限に高めることができます。 例えば、汎用クラスは一度定義するだけで、さまざまなデータ型でインスタンス化でき、柔軟性と型の整合性を提供します。 この記事では、C#ジェネリクスの基本について学びます。 IronPDFライブラリ.

ジェネリッククラスの基本

C#のジェネリック クラスは、含まれる型または操作される型のプレースホルダーを持つクラスを作成するための設計図です。 このプレースホルダー(一般には T で示される)は、クラスがインスタンス化される際に指定される型パラメータを表します。 さまざまなデータ型を扱うために、型パラメータ T を持つ汎用クラスを作成することができます。汎用クラスは特に、リスト、キュー、ハッシュテーブルのようなコレクションクラスに役立ちます。これらは型安全性を確保し、キャストの必要性を減らしながら、任意のデータ型を保持できます。

汎用クラスの簡単な例

任意の型の値を格納するように設計されたBoxという名前の汎用クラスを考えてみましょう。

public class Box<T>
{
    private T data;
    public Box(T data) { this.data = data; }
    public T Data { get { return data; } }
}
public class Box<T>
{
    private T data;
    public Box(T data) { this.data = data; }
    public T Data { get { return data; } }
}
Public Class Box(Of T)
'INSTANT VB NOTE: The field data was renamed since Visual Basic does not allow fields to have the same name as other class members:
	Private data_Conflict As T
	Public Sub New(ByVal data As T)
		Me.data_Conflict = data
	End Sub
	Public ReadOnly Property Data() As T
		Get
			Return data_Conflict
		End Get
	End Property
End Class
VB   C#

このクラスを使用するには、Tの実際の型を指定してインスタンスを作成します:

Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Dim integerBox As New Box(Of Integer)(123)
Dim stringBox As New Box(Of String)("Hello")
VB   C#

このコードは、単一のクラスを示しています (ボックス) 異なるデータ型を保存するために適応できます (intstring**)ジェネリックの力を活用して、コードの再利用性と型安全性を実現する。

ジェネリックメソッドの実装

ジェネリックメソッドは、ジェネリッククラスと似ていますが、メソッドレベルで型パラメータを用いて定義されます。 これは、ジェネリッククラスであっても非ジェネリッククラスであっても、異なる型に対して動作できるメソッドを作成することが可能になります。

ジェネリックメソッドの例

任意の型の配列内で2つの要素を交換するメソッドをご紹介します:

public class Utility
{
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
public class Utility
{
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
Public Class Utility
	Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
		Dim temp As T = lhs
		lhs = rhs
		rhs = temp
	End Sub
End Class
VB   C#

上記のメソッドの使用方法は次のとおりです:

int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);
string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);
string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
Dim a As Integer = 1, b As Integer = 2
Utility.Swap(Of Integer)(a, b)
Dim first As String = "world", second As String = "hello"
Utility.Swap(first, second)
VB   C#

ジェネリックインターフェイスとデリゲートの探求

ジェネリックインタフェースおよびデリゲートは、あらゆる型に対応する契約およびコールバックメソッドを定義することを可能にします。 クラスやメソッドでジェネリックインターフェイスを実装したりジェネリックデリゲートを使用することで、柔軟性とコードの再利用性が向上します。

汎用インターフェイスの例

データアクセス操作のための一般的なリポジトリインターフェースは次のようになります:

public interface IRepository<T>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<T> GetAll();
}
public interface IRepository<T>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<T> GetAll();
}
Public Interface IRepository(Of T)
	Sub Add(ByVal item As T)
	Function GetById(ByVal id As Integer) As T
	Function GetAll() As IEnumerable(Of T)
End Interface
VB   C#

このインターフェイスは、特定のデータ型を処理するために任意のクラスによって実装することができ、異なる型にわたって一貫したデータアクセスパターンを可能にします。

ジェネリックデリゲートの例

型安全なコールバックを定義するためにジェネリックデリゲートを使用できます。

public delegate void Action<T>(T item);
public delegate void Action<T>(T item);
Public Delegate Sub Action(Of T)(ByVal item As T)
VB   C#

ジェネリックコレクションの利用

汎用コレクションクラスとして、List辞書<TKey, TValue>, および System.Collections.Generic** ネームスペース内のその他のコンポーネントは、特定の型のデータを格納し操作するための型安全で効率的なコレクションを提供します。 これらのコレクションは非ジェネリックの対応するものより優れているのは、キャストの必要性を排除し、実行時エラーを減らすためです。

List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
Dim names As New List(Of String)()
names.Add("Alice")
names.Add("Bob")
Dim keyValuePairs As New Dictionary(Of Integer, String)()
keyValuePairs.Add(1, "One")
keyValuePairs.Add(2, "Two")
VB   C#

カスタムジェネリック型の作成

組み込みの汎用型を使用するだけでなく、異なるデータ型に共通する操作をカプセル化するために、型固有の方法で処理する必要がある独自の型を作成することができます。 このアプローチは、さまざまなデータ型で使用されるライブラリ、フレームワーク、またはユーティリティの構築に特に有用です。

カスタムジェネリック型の例

一般的な操作結果をカプセル化し、成功フラグとオプションのメッセージを含むResultクラスを考えてください。

public class Result<T>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }
    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
public class Result<T>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }
    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
Public Class Result(Of T)
	Private privateSuccess As Boolean
	Public Property Success() As Boolean
		Get
			Return privateSuccess
		End Get
		Private Set(ByVal value As Boolean)
			privateSuccess = value
		End Set
	End Property
	Private privateData As T
	Public Property Data() As T
		Get
			Return privateData
		End Get
		Private Set(ByVal value As T)
			privateData = value
		End Set
	End Property
	Private privateMessage As String
	Public Property Message() As String
		Get
			Return privateMessage
		End Get
		Private Set(ByVal value As String)
			privateMessage = value
		End Set
	End Property
	Public Sub New(ByVal success As Boolean, ByVal data As T, Optional ByVal message As String = "")
		Me.Success = success
		Me.Data = data
		Me.Message = message
	End Sub
End Class
VB   C#

IronPDF: C# PDFライブラリ

IronPDF は.NET開発者がアプリケーション内でPDFドキュメントを作成、編集、抽出するために設計された包括的なライブラリです。 IronPDFは助けます HTMLからPDFを生成する既存のPDFの編集、PDFを画像に変換、その他多くの機能。 IronPDF自体はジェネリックに基づいていませんが、C#環境でこのライブラリとやり取りする方法を理解することで、アプリケーションのドキュメント管理機能を大幅に向上させることができます。

コード例: IronPDFでvirtualキーワードを使用する

ここでジェネリクスを使用するアイデアは、任意のHTML文字列からPDFを生成できる再利用可能なメソッドを作成することです。 このメソッドは汎用的なもので、必要に応じてさまざまな種類のメタデータや設定を指定できるようにします。

まず、PDF生成オプションを保持する簡単なジェネリッククラスを定義しましょう。 デモンストレーションの目的のために、このクラスは基本的なものになりますが、必要に応じてプロパティを追加して拡張することができます。

public class PdfOptions<T>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
public class PdfOptions<T>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
Public Class PdfOptions(Of T)
	Public Property Metadata() As T
	Public Property HtmlContent() As String
End Class
VB   C#

では、PdfOptionsを活用してIronPDFを使用するPDFを生成する静的メソッドを作成しましょう。クラス このメソッドは、PdfOptions のインスタンスを受け取ります。ジェネリックを実際に使用する例として、** をそのパラメーターにします。

public static class PdfGenerator
{
    public static void GeneratePdf<T>(PdfOptions<T> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();
        // Optional: Apply any renderer options here. For example, setting the paper size.
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);
        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
        // For simplicity, we're just printing the metadata to console if it's of type string.
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }
        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
public static class PdfGenerator
{
    public static void GeneratePdf<T>(PdfOptions<T> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();
        // Optional: Apply any renderer options here. For example, setting the paper size.
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);
        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
        // For simplicity, we're just printing the metadata to console if it's of type string.
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }
        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
Public Module PdfGenerator
	Public Sub GeneratePdf(Of T)(ByVal options As PdfOptions(Of T))
		' Initialize the IronPDF HtmlToPdf renderer
		Dim renderer = New ChromePdfRenderer()
		' Optional: Apply any renderer options here. For example, setting the paper size.
		renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
		' Generate the PDF from HTML content
		Dim pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent)
		' Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
		' For simplicity, we're just printing the metadata to console if it's of type string.
		Dim tempVar As Boolean = TypeOf options.Metadata Is String
		Dim metadataString As String = If(tempVar, CStr(options.Metadata), Nothing)
		If tempVar Then
			Console.WriteLine($"Metadata: {metadataString}")
		End If
		' Save the PDF to a file
		Dim fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf"
		pdfDocument.SaveAs(fileName)
		Console.WriteLine($"PDF generated and saved as {fileName}")
	End Sub
End Module
VB   C#

最後に、私たちの PdfGenerator クラスを使用してPDFドキュメントを生成しましょう。 この例では、Metadata プロパティは、タイトルやその他の関連情報を含む文字列になる可能性があります。

class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };
        PdfGenerator.GeneratePdf(options);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };
        PdfGenerator.GeneratePdf(options);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"
		Dim options = New PdfOptions(Of String) With {
			.HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
			.Metadata = "Test PDF Title"
		}
		PdfGenerator.GeneratePdf(options)
	End Sub
End Class
VB   C#

この例は、IronPDFをC#のジェネリクスと統合する基本を示しており、HTMLコンテンツからPDFを生成する柔軟な方法を提供します。また、ジェネリックなPdfOptionsを通じて、メタデータや設定のカスタマイズを可能にします。クラス 必要に応じて、アプリケーション向けにより高度なオプションやレンダラーの設定を追加することで、これを拡張することができます。

C# ジェネリクス(開発者向けの動作説明):図1 - genericsを利用してHTML文字列からPDFドキュメントを作成するコードの例(IronPDF使用)

結論

C# ジェネリクス(開発者向け技術):図2 - IronPDFライセンスページ

C#ジェネリクスは、高品質で再利用可能、かつ型安全なコードを開発するための強力なツールです。 ジェネリッククラス、メソッド、インターフェース、およびデリゲートを理解して適用することによって、より柔軟でメンテナンスが容易なコードを書くことができます。 ジェネリクスは、さまざまなデータ型でのコード再利用を可能にするだけでなく、コンパイル時の型チェックを保証することにより、実行時エラーを減少させ、全体的なコード品質を向上させます。 IronPDFは 無料試用 費用は $749 からです。

< 以前
C# String.Join(開発者向けの使い方)
次へ >
C# の Virtual キーワード(開発者向けの仕組み)

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >