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

C#のインデクサー(開発者向けの仕組み)

C# のインデクサーは、配列アクセス演算子 [] を使用してクラスまたは構造体のインスタンスにアクセスできるようにする特殊なタイプのプロパティです。 インデクサーは"スマート配列"を作成したり、簡略化された構文でデータをカプセル化する際に非常に便利です。 クラスのインスタンスを配列のように使用し、インデックスを介してデータにアクセスできる方法を提供します。 この記事では、実際の例を用いてC#のインデクサーの宣言方法と使用方法を探ります。 また、記事の最後で<IronPDFライブラリについても探ります。

インデクサーの基本構文

インデクサーは、クラスまたは構造体で this キーワードを使用し、その後にインデクサー宣言が続くインスタンス メンバーです。 また、パラメータの型と戻り値の型を指定します。 インデクサーのインスタンスメンバーの一般的な構文は次のようになります。

public return_type this[parameter_type index]
{
    get
    {
        // Code to return data
    }
    set
    {
        // Code to set data
    }
}
public return_type this[parameter_type index]
{
    get
    {
        // Code to return data
    }
    set
    {
        // Code to set data
    }
}
$vbLabelText   $csharpLabel

ここで、return_type はインデクサーが返す値の型 (整数値など) であり、parameter_type はインデックスの型 (多くの場合、int) です。 get アクセサは指定されたインデックスの値を返し、set ブロック コード アクセサはそのインデックスに値を割り当てます。

インデクサーの宣言と使用

C#クラス内でのインデクサーの実装の基本的な例を見てみましょう。 文字列の配列をカプセル化するクラス Program を考えてみましょう。

class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
$vbLabelText   $csharpLabel

上記のコードでは:

  • Program クラスには、values という名前の文字列配列が含まれています。
  • string this[int index] はインデクサー宣言であり、int index は配列の要素にアクセスするために使用されるインデックス パラメーター化プロパティです。
  • get アクセサは指定されたインデックスのインデックス値を返し、set アクセサはそのインデックスにインデックス値を割り当てます。

つまり、次のように、Program クラスのインスタンスを作成し、インデクサーを使用してその values 配列にアクセスできます。

class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
$vbLabelText   $csharpLabel

このコードでは、配列内の要素にアクセスする方法と同様に、インデクサーが values 配列にアクセスするための簡単な構文を提供していることがわかります。

get および set アクセサの理解

インデクサー内の get および set アクセサーは、プロパティの場合と同様にデータを取得および割り当てることができるブロック コードのようなものです。 主な違いは、インデクサーが個々のデータメンバーではなく、データの集合を扱うためにインデックスパラメータを使用することです。

get ブロックは指定されたインデックスでデータを返す役割を担い、set ブロックは指定されたインデックスにデータを割り当てます。 Here's another example to solidify your understanding:

class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
$vbLabelText   $csharpLabel

この例では:

  • StudentRecords クラスには、生徒の名前を保持するプライベートな string[] studentNames 配列があります。
  • インデクサーは、値を設定または取得する前にインデックスが配列の範囲内にあることを確認します。
  • int 型の Length プロパティは、配列の長さへのアクセスを提供します。

このクラスは、次のように Main メソッドで使用できます。

class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
$vbLabelText   $csharpLabel

ジェネリックなインデクサーの作成

インデクサーを使用して、複数のデータ型を扱うジェネリックなクラスを作成することもできます。以下は、ジェネリックインデクサーを持つジェネリッククラスの簡単な例です。

class GenericClass<t>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
class GenericClass<t>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
$vbLabelText   $csharpLabel

このコードでは:

  • GenericClassクラスは、任意のデータ型と一緒に動作することができるインデクサーを定義します。
  • this[int index] インデクサーを使用すると、型に関係なく配列内の要素にアクセスできます。

Main メソッドで、さまざまなデータ型で GenericClass を使用できるようになりました。

class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;

        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";

        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }

        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;

        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";

        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }

        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
$vbLabelText   $csharpLabel

C#インデクサーでIronPDFを使う

C# インデクサー (開発者向けの仕組み): 図 1 - IronPDF

IronPDFは、.NETアプリケーションでのPDFの生成、編集、および変換を目的としたC#ライブラリです。 開発者がHTML からPDFを作成したり、PDFファイルを操作したり、マージ、印刷、署名の追加など高度な機能をプログラムで処理したりするための手続きを簡素化します。

インデクサーを利用するC#プログラム内でIronPDFを活用して、動的にPDFコンテンツを生成および管理することができます。 例えば、HTML文字列を保持するクラスがあり、インデクサーを使用して各HTMLエントリのPDFを生成したい場合、このようになります。 このアプローチにより、PDFの生成が合理化され、コードの整理と直感的な操作が可能になります。

using IronPdf;
using System;

class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }

    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}

class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";

        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");

        Console.WriteLine("PDFs generated successfully.");
    }
}
using IronPdf;
using System;

class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }

    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}

class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";

        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");

        Console.WriteLine("PDFs generated successfully.");
    }
}
$vbLabelText   $csharpLabel

C# インデクサー (開発者向けの仕組み): 図 2 - コンソール出力

結論

C#インデクサーは、クラスや構造体を配列のように動作させるのに役立つ機能です。 簡略化された構文と柔軟なデータアクセスを提供することにより、より直感的で読みやすいコードを作成することができます。 文字列、整数、または他の任意のデータ型を扱う際に、インデクサーを使用することでデータ構造をカプセル化し、インデックスを使用して効率的かつクリーンにアクセスすることが可能です。

IronPDFは、PDFを作成、操作およびレンダリングするために必要なすべての機能にアクセスできる無料トライアルを利用し、簡単に使用を開始できます。 じっくりとソフトウェアを試してみて、満足したら、$799 からライセンスを入手できます。

よくある質問

C#のインデクサとは何ですか?

C#のインデクサは、クラスや構造体のインスタンスを配列アクセス演算子[] を使用してアクセスできる特別な種類のプロパティです。クラスのインスタンスを配列のように使用する方法を提供します。

C#で基本的なインデクサをどのように宣言しますか?

C#での基本的なインデクサは、'this'キーワードに続いてインデクサの宣言を書いて宣言します。パラメータの型と戻り値の型を指定する必要があります。例えば:public return_type this[parameter_type index] { get; set; }

インデクサでの'get'および'set'アクセサの目的は何ですか?

'get'アクセサは、指定されたインデックスのデータを取得するために使用し、'set'アクセサは、指定されたインデックスにデータを割り当てるために使用します。プロパティアクセサと同様に機能しますが、データのコレクションに使用されます。

C#クラスでインデクサの例を提供できますか?

もちろんです。プライベートな文字列配列を持つクラス'Program'を考えてみてください。インデクサは、整数インデックスを使用してこの配列にアクセスを許可します。例えば:public string this[int index] { get { return values[index]; } set { values[index] = value; } }

C#でジェネリックなインデクサをどのように作成しますか?

C#でのジェネリックなインデクサは、ジェネリッククラス内で作成できます。例えば、クラスGenericClassには、任意のデータ型を処理できるインデクサが含まれています。インデクサはpublic T this[int index] { get; set; }と宣言されます。

C#でPDF生成を合理化するためにインデクサをどのように使用しますか?

IronPDFのようなライブラリを使用すると、クラス内に保存されているHTMLテンプレートをインデクサで管理しアクセスできます。そしてこれらはPDFドキュメントに変換されます。このアプローチは、複数のHTMLソースから動的PDFを生成するプロセスを簡素化します。

インデクサを使用したPDFライブラリの事例を提供できますか?

もちろんです。配列にHTMLテンプレートを保存するクラスを作成し、インデクサでこれらのテンプレートにアクセスします。その後、PDFライブラリを使用してこれらのHTML文字列をPDFドキュメントとしてレンダリングします。例えば、PdfGeneratorと呼ばれるクラスがインデクサを使用してHTMLにアクセスし、PDFを生成します。

C#のインデクサを使用する利点は何ですか?

C#のインデクサは、コレクション内の要素にアクセスするための簡素な構文を提供し、コードを直感的かつ読みやすくします。クラスや構造体を配列のように振る舞わせることができ、効率的なデータのカプセル化とアクセスが可能になります。

C#で動的データ構造を作成するのにインデクサがどのように役立ちますか?

インデクサは、配列のような構文を使用してコレクションにアクセスおよび変更できるため、開発者が動的データ構造を作成することを可能にします。これは、特にデータが柔軟に管理される必要があるシナリオ、例えば動的PDFコンテンツ生成において有用です。

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

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

彼の主要なIronPDFとIron Suite .NETライブラリは、世界中で3000万以上のNuGetインストールを達成し、彼の基礎となるコードは世界中で使用されている開発者ツールに力を与え続けています。25年の商業経験と41年のコーディングの専門知識を持つJacobは、次世代の技術リーダーを指導しながら、エンタープライズグレードのC#、Java、Python PDFテクノロジーにおけるイノベーションの推進に注力しています。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me