.NET ヘルプ

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

公開済み 2024年10月23日
共有:

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

インデクサーの基本構文

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

public return_type this[parameter_type index]
{
    get
    {
        // code to return data
    }
    set
    {
        // set accessor, code to set data
    }
}
public return_type this[parameter_type index]
{
    get
    {
        // code to return data
    }
    set
    {
        // set accessor, 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)
		' set accessor, code to set data
	End Set
End Property
VB   C#

ここで、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
VB   C#

上記のコードでは

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

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

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
VB   C#

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

アクセサのgetとsetを理解する

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

get ブロックは指定されたインデックスのデータを返す役割を担い、set ブロックは指定されたインデックスにデータを割り当てます。 理解を深めるために、もう1つ例を挙げましょう:

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
VB   C#

この例では:

  • StudentRecords クラスは、プライベート文字列[]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
VB   C#

汎用インデクサの作成

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

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
VB   C#

このコードでは:

  • ジェネリッククラス** クラスは、任意のデータ型で動作するインデクサを定義します。
  • この[インデックス]**インデクサーを使用すると、型に関係なく配列の要素にアクセスできます。

    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]);
        }
    }
}
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
VB   C#

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

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

IronPDFは.NETアプリケーションでPDFを生成、編集、変換するために設計されたC#ライブラリです。 開発者のために、PDFでの作業を簡素化します。HTMLからPDFを作成.NET、Java、Python、またはNode jsを使用するソフトウェア開発者向けツールで、PDFファイルを操作し、結合、印刷、署名の追加などの高度な機能をプログラムで処理します。

PDFコンテンツを動的に生成し管理するためにインデクサを利用するC#プログラムでIronPDFを活用することができます。 例えば、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
VB   C#

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

結論

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

IronPDFを使えば、簡単に翻訳を始めることができます。無料試用PDFの作成、操作、レンダリングに必要なすべての機能へのアクセスを提供します。 じっくりとソフトウェアを検討することができ、ご満足いただけましたら、749ドルからライセンスをお求めいただけます。

< 以前
C#新しいGUID(開発者のための仕組み)
次へ >
C# foreach with index (開発者のための仕組み)