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

C# Generics(開発者向けの動作方法)

C# のジェネリックは、管理するデータの型をパラメーターとして指定できるクラス、メソッド、インターフェース、およびデリゲートを設計するための方法を導入します。 この概念は、ジェネリック型パラメーターとして知られており、柔軟で再利用可能なコードコンポーネントの作成を可能にします。 ジェネリックスを使用することで、コードの再利用性、型の安全性、およびパフォーマンスを最大化できます。 たとえば、ジェネリッククラスは一度定義され、さまざまなデータ型でインスタンス化されることができます。これにより、柔軟性と型の整合性が提供されます。 この記事では、C# ジェネリックの基本とPDF 操作のための 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
$vbLabelText   $csharpLabel

このクラスを使用するには、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")
$vbLabelText   $csharpLabel

このコードは、単一のクラス (Box) が異なるデータ型 (int, string) を格納するために適応できる方法を説明し、ジェネリックスのコード再利用と型の安全性の強力さを示しています。

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

ジェネリックメソッドは、型パラメーターをメソッドレベルで定義する点でジェネリッククラスに似ています。 これは、非ジェネリッククラスまたはジェネリッククラスで定義され、異なる型で操作するメソッドを作成することを可能にします。

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

任意の型の配列内の2つの要素を交換するメソッドを以下に示します。

public class Utility
{
    // Swaps two elements by reference using generics
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs; // Store lhs in a temporary variable
        lhs = rhs;    // Assign rhs to lhs
        rhs = temp;   // Assign temp (original lhs) to rhs
    }
}
public class Utility
{
    // Swaps two elements by reference using generics
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs; // Store lhs in a temporary variable
        lhs = rhs;    // Assign rhs to lhs
        rhs = temp;   // Assign temp (original lhs) to rhs
    }
}
Public Class Utility
	' Swaps two elements by reference using generics
	Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
		Dim temp As T = lhs ' Store lhs in a temporary variable
		lhs = rhs ' Assign rhs to lhs
		rhs = temp ' Assign temp (original lhs) to rhs
	End Sub
End Class
$vbLabelText   $csharpLabel

上記のメソッドの使用法は次のようになります。

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

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

ジェネリックインターフェースとデリゲートは、任意の型で動作する契約やコールバックメソッドを定義することを可能にします。 ジェネリックインターフェースを実装したり、ジェネリックデリゲートをクラスやメソッドで使用したりすることで、柔軟性とコードの再利用性を向上させます。

ジェネリックインターフェースの例

データアクセス操作のためのジェネリックリポジトリインターフェイスは、次のようになるかもしれません。

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

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

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

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

public delegate void Action<T>(T item);
public delegate void Action<T>(T item);
Public Delegate Sub Action(Of T)(ByVal item As T)
$vbLabelText   $csharpLabel

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

ジェネリックコレクションクラス、たとえば ListDictionary<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")
$vbLabelText   $csharpLabel

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

組み込みのジェネリックタイプの使用を超えて、あなた自身のものを作成することで、異なるデータ型全体に共通するが型特有に扱う必要がある操作をカプセル化できます。 このアプローチは、異なるデータ型で使用されるライブラリ、フレームワーク、またはユーティリティを構築するために特に有用です。

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

操作の結果と成功フラグおよびオプションのメッセージをカプセル化するジェネリック 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
$vbLabelText   $csharpLabel

IronPDF: C# PDF ライブラリ

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

IronPDF と仮想キーワードを使用したコード例

ここでジェネリックスを使用する考え方は、任意の 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
$vbLabelText   $csharpLabel

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

using IronPdf; // Make sure to include the necessary namespace for IronPDF

public static class PdfGenerator
{
    // Generates a PDF from provided HTML content and options
    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}");
    }
}
using IronPdf; // Make sure to include the necessary namespace for IronPDF

public static class PdfGenerator
{
    // Generates a PDF from provided HTML content and options
    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}");
    }
}
Imports IronPdf ' Make sure to include the necessary namespace for IronPDF

Public Module PdfGenerator
	' Generates a PDF from provided HTML content and options
	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
$vbLabelText   $csharpLabel

最後に、PdfGenerator クラスを使用して PDF ドキュメントを生成しましょう。 この例において、Metadata プロパティはタイトルや関連と思われるその他の情報を含む文字列となるかもしれません。

class Program
{
    static void Main(string[] args)
    {
        // Set the license key for IronPDF if needed
        License.LicenseKey = "Your-License-Key-Here";

        // Create PDF options with HTML content and metadata
        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"
        };

        // Generate the PDF using the specified options
        PdfGenerator.GeneratePdf(options);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Set the license key for IronPDF if needed
        License.LicenseKey = "Your-License-Key-Here";

        // Create PDF options with HTML content and metadata
        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"
        };

        // Generate the PDF using the specified options
        PdfGenerator.GeneratePdf(options);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Set the license key for IronPDF if needed
		License.LicenseKey = "Your-License-Key-Here"

		' Create PDF options with HTML content and metadata
		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"
		}

		' Generate the PDF using the specified options
		PdfGenerator.GeneratePdf(options)
	End Sub
End Class
$vbLabelText   $csharpLabel

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

C# Generics (How It Works For Developers): 図 1 - HTML 文字列から IronPDF を使用して PDF ドキュメントを作成するためのジェネリックスを利用する例のコード出力

結論

C# Generics (How It Works For Developers): 図 2 - IronPDF ライセンスページ

C# のジェネリックスは、高品質で再利用可能で型安全なコードを開発するための強力なツールです。 ジェネリッククラス、メソッド、インターフェース、およびデリゲートを理解し適用することで、より適応性があり、保守が容易なコードを記述できます。 ジェネリックスは、異なるデータタイプにわたるコードの再利用を可能にするだけでなく、コンパイル時の型チェックを保証し、実行時のエラーを減少させ、全体的なコードの品質を向上させます。 IronPDF はその PDF ライブラリツールの無料試用版を提供しており、費用は$799からです。

よくある質問

C#のジェネリックとは何ですか?

C# ジェネリックは、型パラメーターを持つクラス、メソッド、インターフェース、デリゲートを設計する方法を導入します。これにより、型安全性とパフォーマンス改善を提供する柔軟で再利用可能なコードコンポーネントを作成できます。

C# におけるジェネリッククラスはどのように機能しますか?

C# のジェネリッククラスは、通常 T と表される型パラメーターを使用し、含まれるまたは操作される型のプレースホルダーとして機能します。これにより、型安全性を維持しつつ、さまざまなデータ型でクラスをインスタンス化できます。

C# のジェネリッククラスの例を教えてください。

はい、簡単な例として、任意の型の値を格納する Box クラスがあります。BoxBox のようにインスタンスを作成して、同じクラスを使用して異なるデータ型を格納できます。

C# のジェネリックメソッドとは何ですか?

ジェネリックメソッドは、メソッドレベルで型パラメータを定義し、さまざまな型で操作できるようにするものです。非ジェネリッククラスまたはジェネリッククラスの一部として使用でき、メソッド設計に柔軟性を提供します。

C#でジェネリックインターフェースとデリゲートはどのように使用できますか?

ジェネリックインターフェースとデリゲートは、任意の型で動作する契約とコールバックメソッドを定義でき、柔軟性とコードの再利用性を高めます。

C# のジェネリックコレクションを使用する利点は何ですか?

ListDictionary などのジェネリックコレクションは、特定の型に対して型安全で効率的なストレージを提供し、キャストを排除し、ランタイムエラーを減少させます。

C# でカスタムジェネリック型を作成するにはどうすればよいですか?

異なるデータ型にわたって共通の操作をカプセル化するために、型特有の方法で扱うカスタムジェネリック型を作成できます。ライブラリやユーティリティの構築に役立ちます。

C#ジェネリックは .NET のPDF生成をどのように改善できますか?

C#のジェネリックをPDFライブラリと共に使用して、柔軟で再利用可能なコンポーネントを作成できます。たとえば、PdfOptions クラスを使用してPDF生成オプションを保持することで、ジェネリックのPDFタスクへの適応性を示します。

C#ジェネリックをPDFライブラリでどのように利用しますか?

IronPDFのようなPDFライブラリは、C#ジェネリックを使用してその機能強化できます。たとえば、HTMLをPDFに変換するジェネリックメソッドを使用でき、文書生成に対して柔軟なアプローチを提供します。

C# ジェネリックを使用する利点は何ですか?

C#ジェネリックは異なるデータ型にわたってコードを再利用し、コンパイル時の型チェックを保証し、ランタイムエラーを減少させ、全体的なコード品質を向上させます。適応性がありメンテナブルなコードを書くことができます。

Curtis Chau
テクニカルライター

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

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