フッターコンテンツにスキップ
.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; }
    }
}
$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");
$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
    }
}
$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);
$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();
}
$vbLabelText   $csharpLabel

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

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

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

public delegate void Action<T>(T item);
public delegate void Action<T>(T item);
$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");
$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;
    }
}
$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; }
}
$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}");
    }
}
$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);
    }
}
$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#ジェネリックは異なるデータ型でコードを再利用し、型チェックを保証して全体的なコード品質を向上させます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。