クラスの添え字アクセスに対応する - インデクサーに対応するクラスの実装 (インデクサの実装) - C#

インデクサーに対応するクラスを作成するコードを紹介します。

プログラム例 (getの例)

UI

下図のUIを作成します。ButtonとMultiLineプロパティをtrueにしたTextBoxを配置します。

コード

下記のコードを記述します。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace IndexerClass
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyClass m = new MyClass();
      textBox1.Text = "値:" + Convert.ToString(m[3]);

    }
  }
}
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IndexerClass
{
  public class MyClass
  {
    private int[] Values;

    public MyClass()
    {
      Values = new int[5];
      Values[0] = 10;
      Values[1] = 20;
      Values[2] = 150;
      Values[3] = 1000;
      Values[4] = 400;
    }

    public int this[int index]
    {
      get
      {
        if (index < Values.Length) {
          return Values[index];
        }
        else {
          return -1;
        }
      }
    }

  }
}

解説

クラスのインデクサを実装する場合はthisプロパティを実装します。
今回の実装例では、インデクサに与えられた数値の位置のValues配列の値を返す実装をしています。
フォーム側でMyClass[3]を指定しているため、戻り値はValues[3]の"1000"になります。
public int this[int index]

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button1]をクリックします。インデクサに与えられた数値から値を取得し、"1000"がテキストボックスに表示されます。

プログラム例2 (setの例)

UI

下図のUIを作成します。ButtonとMultiLineプロパティをtrueにしたTextBoxを配置します。

コード

FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace IndexerClass
{
  public partial class FormSet : Form
  {
    public FormSet()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyClassRW m = new MyClassRW();
      textBox1.Text = "値:" + Convert.ToString(m[2]) + "\r\n";
      m[2] = 25;
      textBox1.Text += "値:" + Convert.ToString(m[2]) + "\r\n";
    }
  }
}
MyClassRW.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IndexerClass
{
  public class MyClassRW
  {
    private int[] Values;

    public MyClassRW()
    {
      Values = new int[5];
      Values[0] = 10;
      Values[1] = 20;
      Values[2] = 150;
      Values[3] = 1000;
      Values[4] = 400;
    }

    public int this[int index]
    {
      get
      {
        if (index < Values.Length) {
          return Values[index];
        }
        else {
          return -1;
        }
      }

      set
      {
        if (index < Values.Length) {
          Values[index] = value;
        }
      }

    }
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button1]をクリックします。インデクサに与えられた数値から値を取得し、値がテキストボックスに表示されます。インデクサを利用した値の代入もできていることが確認できます。



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2011-11-29
iPentec all rights reserverd.