配列型のプロパティの実装 - 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 IndexerProperty
{
  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.numvalue[5]);
      
    }
  }
}
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

    public MyClass()
    {
      Values = new int[7];
      Values[0] = 5;
      Values[1] = 8;
      Values[2] = 1;
      Values[3] = 4;
      Values[4] = 9;
      Values[5] = 2;
      Values[6] = 0;
    }

    public int[] numvalue
    {
      get
      {
          return Values;
      }
    }
  }
}

解説

配列型のプロパティを実装する場合は、プロパティの型に配列型を指定します。配列型を利用した場合はプロパティのgetの戻り値、setの値に配列型を与えます。上記のコードではint型の配列プロパティnumvalueを実装しています。

実行結果

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


[Button1]をクリックします。配列型のプロパティにアクセスし取得した値をテキストボックスに表示します。

補足

配列プロパティの場合は、プロパティにgetしか実装されていない場合でも、配列の個々の要素への代入はできます。

UI

下図のUIを作成します。(今回はbutton2のみを利用します。)

コード

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 IndexerProperty
{
  public partial class FormGet : Form
  {
    public FormGet()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      MyClass m = new MyClass();
      textBox1.Text = "値2:" + Convert.ToString(m.numvalue[2]) + "\r\n";
      textBox1.Text += "値5:" + Convert.ToString(m.numvalue[5]) + "\r\n";
      m.numvalue[2] = 41;
      m.numvalue[5] = 12;

      textBox1.Text += "値2:" + Convert.ToString(m.numvalue[2]) + "\r\n";
      textBox1.Text += "値5:" + Convert.ToString(m.numvalue[5]) + "\r\n";

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

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

    public MyClass()
    {
      Values = new int[7];
      Values[0] = 5;
      Values[1] = 8;
      Values[2] = 1;
      Values[3] = 4;
      Values[4] = 9;
      Values[5] = 2;
      Values[6] = 0;
    }

    public int[] numvalue
    {
      get
      {
          return Values;
      }
    }
  }
}

実行結果

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


[button2]をクリックします。配列に代入されていた元の数値がテキストボックスに表示され、続いて代入した新しい値がテキストボックスに表示されています。

プログラム(setの例)

UI

下図のUIを作成します。

コード

下記のコードを記述します。
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 IndexerProperty
{
  public partial class FormSet : Form
  {
    public FormSet()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyClassRW m = new MyClassRW();
      textBox1.Text = "値2:" + Convert.ToString(m.numvalue[2]) + "\r\n";
      textBox1.Text += "値3:" + Convert.ToString(m.numvalue[3]) + "\r\n";

      int[] newvalue = { 4, 8, 9, 2, 10 };
      m.numvalue= newvalue;

      textBox1.Text += "値2:" + Convert.ToString(m.numvalue[2]) + "\r\n";
      textBox1.Text += "値3:" + Convert.ToString(m.numvalue[3]) + "\r\n";
    }
  }
}
MyClassRW.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

    public MyClassRW()
    {
      Values = new int[7];
      Values[0] = 5;
      Values[1] = 8;
      Values[2] = 1;
      Values[3] = 4;
      Values[4] = 9;
      Values[5] = 2;
      Values[6] = 0;
    }

    public int[] numvalue
    {
      get
      {
        return Values;
      }

      set
      {
        Values = value;
      }

    }
  }
}

解説

プロパティにsetが実装されているため、プロパティに配列を代入して値をまとめて置き換えることができます。
上記のコードではint型配列を作成し、numvalueプロパティに代入して元のValues配列の内容を置き換える処理をしています。

実行結果

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


[button1]をクリックします。変更前のValues[2]の値である"1",Values[3]の値である"4"がテキストボックスに表示され、その後Valuesが置換され、新しいValues[2]の値である"9"とValues[3]の値である"2"がテキストボックスの表示されます。

補足

クラスオブジェクト自体に添え字を与える実装については「クラスの添え字アクセスに対応する - インデクサーに対応するクラスの実装 (インデクサの実装)」を参照してください。

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