フッターコンテンツにスキップ
.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
    }
}
Default Public Property Item(ByVal index As parameter_type) As return_type
	Get
		' Code to return data
	End Get
	Set(ByVal value As return_type)
		' Code to set data
	End Set
End Property
$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;
        }
    }
}
Friend Class Program
	Private values(4) As String ' Array with 5 elements
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return values(index)
		End Get
		Set(ByVal value As String)
			values(index) = value
		End Set
	End Property
End Class
$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
    }
}
Friend Class Program
	Shared Sub Main()
		Dim program As 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
	End Sub
End Class
$vbLabelText   $csharpLabel

このコードでは、インデクサーが配列の要素にアクセスするためのシンプルな構文を提供していることがわかります。

getおよびsetアクセサーを理解する

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

getブロックは指定されたインデックスのデータを返し、setブロックは指定されたインデックスにデータを割り当てます。 もう一つの例を示しますが、理解を深めるためのものです。

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; }
    }
}
Friend Class StudentRecords
	Private studentNames(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			If index >= 0 AndAlso index < studentNames.Length Then
				Return studentNames(index)
			End If
			Return "Invalid Index"
		End Get
		Set(ByVal value As String)
			If index >= 0 AndAlso index < studentNames.Length Then
				studentNames(index) = value
			End If
		End Set
	End Property
	Public ReadOnly Property Length() As Integer
		Get
			Return studentNames.Length
		End Get
	End Property
End Class
$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]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim records As New StudentRecords()
		' Set values using indexer
		records(0) = "John"
		records(1) = "Jane"
		records(2) = "Bob"
		' Access values using indexer
		For i As Integer = 0 To records.Length - 1
			Console.WriteLine(records(i))
		Next i
	End Sub
End Class
$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; }
    }
}
Friend Class GenericClass(Of T)
	Private elements(4) As T
	Default Public Property Item(ByVal index As Integer) As T
		Get
			Return elements(index)
		End Get
		Set(ByVal value As T)
			elements(index) = value
		End Set
	End Property
	Public ReadOnly Property Length() As Integer
		Get
			Return elements.Length
		End Get
	End Property
End Class
$vbLabelText   $csharpLabel

このコードでは:

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

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

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]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim intArray As New GenericClass(Of Integer)()
		intArray(0) = 10
		intArray(1) = 20

		Dim stringArray As New GenericClass(Of String)()
		stringArray(0) = "Hello"
		stringArray(1) = "World"

		' Output the integer array values
		For i As Integer = 0 To intArray.Length - 1
			Console.WriteLine(intArray(i))
		Next i

		' Output the string array values
		For i As Integer = 0 To stringArray.Length - 1
			Console.WriteLine(stringArray(i))
		Next i
	End Sub
End Class
$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.");
    }
}
Imports IronPdf
Imports System

Friend Class PdfGenerator
	Private htmlTemplates(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return htmlTemplates(index)
		End Get
		Set(ByVal value As String)
			htmlTemplates(index) = value
		End Set
	End Property

	Public Sub GeneratePdf(ByVal index As Integer, ByVal outputPath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(Me(index)) ' Access HTML string using indexer
		pdfDocument.SaveAs(outputPath)
	End Sub
End Class

Friend Class Program
	Public Shared Sub Main()
		Dim pdfGen As 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.")
	End Sub
End Class
$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コンテンツ生成において有用です。

Curtis Chau
テクニカルライター

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

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