画像ファイル
画像ファイル インデクサ
VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル

インデクサとは?
インデクサとは何であろうか?

文字列の中から文字を取得するインデクサ
C# コード
string s = "ABCDE";
char c =s[1];
Console.WriteLine(c.ToString());
上のコードを見て欲しい、文字列sの2番目の文字を書き出している。
このコードを見てs[1]が何を意味するか解った人は以下の説明を必要としないかも知れない。
配列かなと思った人は以下の説明を読んで欲しい。
結論から言うとs[1]は配列の2番目の要素を参照しているのではなく、Stringクラスが持つ、
インデクサと言う方法(引数付きのプロパティ)で文字列の2番目の文字を取得しているのだ。

VB6にはインデクサが有った
社員の名前が沢山のテキストボックスに表示されていて、スクロールバーを操作すると新しい社員の
名前を読み込んでスクロールするようなフォームが有ると思って戴きたい。
VB6以前にはデフォルトプロパティと言うものが有って、TextBox[1].Textと書く代わりに
TextBox[1]と書けばTextBox[1]のTextプロパティが参照できた。
このプロパティを省略する方法は沢山のTextBoxを操作する場合は便利である。

実はC#もVB.NETもこの様なアクセスが可能である。
この様な操作をC#はインデクサと言い、VB.NETはトラディショナルなデフォルトプロパティと言う。
この一見全く関係の無さそうな名前が実は同じ機能を提供するのである。

テキストボックスの文字をインデクサでシフトさせるサンプルコード
さてこのインデクサを説明する為に、画面上に5つのテキストボックスを横に並べて、 この中の文字をフォームをクリックする度に右から左にシフトするプログラムを使って 説明しよう。
画像ファイル

C#コード
//テキストボックスの配列
TextBox[] tBox = new TextBox[5];
//テキストボックスの配列を持つクラス
ArryTextBox aBox;
public Form1()
{
InitializeComponent();
for (int i = 0; i < 5; i++)
{
//新しいテキストボックスを作成して配列に格納
tBox[i] = new TextBox ();
tBox[i].Parent = this;
//テキストボックスの位置を設定
tBox[i].Location = new Point(tBox[i].Width * i + 5, 10);
//個別のTextを設定する
tBox[i].Text = "textBox" + i.ToString();
}
//配列の参照を持つクラスに配列を設定する
aBox = new ArryTextBox(tBox);
}
VB.NETコード
'テキストボックスの配列
Dim tBox(5) As TextBox

'テキストボックスの配列を持つクラス
Dim aBox As ArryTextBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load

For i As Integer = 0 To 4
'新しいテキストボックスを作成して配列に格納
tBox(i) = New TextBox()
tBox(i).Parent = Me
'テキストボックスの位置を設定
tBox(i).Location = New Point(tBox(i).Width * i + 5, 10)
'個別のTextを設定する
tBox(i).Text = "textBox" + i.ToString()
Next
'配列の参照を持つクラスに配列を設定する
aBox = New ArryTextBox(tBox)
End Sub
先ずテキストボックスの配列を宣言し、其のテキストボックスの配列全体の参照を格納するクラスを 宣言する。
tBox[](tBox())はテキストボックスの配列で有り、aBoxはその配列全体の参照を持つクラスである。
aBoxに関しては後に説明する。
先ずテキストボックスを5つ作成して、テキストボックスの配列に入れる。
次に作成したテキストボックスを横に並べます。
最後に
C#コード
aBox = new ArryTextBox(tBox);
VB.NETコード
aBox = New ArryTextBox(tBox)
で配列全体をあるクラスに入れます。(ここは後で説明する)

クリックイベント
フォーム上のクリックによりTexBoxに表示されている文字が右にシフトするコードを示します。
C#コード
//フォームをクリックするとテキストボックスの文字が移動する
private void Form1_Click(object sender, EventArgs e)
{
//一番右のテキストを保存
string btext = aBox[4];
//右にシフト
for (int i = 3; i > -1; i--)
aBox[i + 1] = aBox[i];
//一番左のテキストボックスに一番右の文字を入れる
aBox[0] = btext;
}
VB.NETコード
'テキストボックスを継承したテキストボックスの配列
Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Click
'一番右のテキストを保存
Dim btext As String = aBox(4)
'右にシフト
For i As Integer = 3 To 0 Step -1
aBox(i + 1) = aBox(i)
Next
'一番左のテキストボックスに一番右の文字を入れる
aBox(0) = btext
End Sub
さてこのコードはフォームの空いた場所をクリックするとテキストボックスが右にシフトするコードで有るが 肝心なのは
C#コード
aBox[i + 1] = aBox[i];
VB.NETコード
aBox(i + 1) = aBox(i)	
この部分で有り、注目すべきはaBoxはテキストボックスクラスであるが、それがあたかも文字列の配列の様に 読み書きされている点であります。
これがインデクサです。
そして其の秘密はaBoxクラスの中に有るのです。

インデクサ(デフォルトプロパティを内蔵したクラス)
C#コード
//テキストボックスの配列を持つクラス
public class ArryTextBox
{
private TextBox[] tb;//内部の配列

//コンストラクタ、引数にテキストボックスの配列を持つ
public ArryTextBox(TextBox[] formsTextBox )
{
//内部の配列に参照を設定する
tb = formsTextBox;
}

//インデクサ
public String this[int index]
{
get
{
return tb[index].Text;
}
set
{
tb[index].Text = value;
}
}
}
VB.NETコード
'テキストボックスの配列を持つクラス
Public Class ArryTextBox

Private tb As TextBox() '内部の配列

'コンストラクタ、引数にテキストボックスの配列を持つ
Public Sub New(ByVal formsTextBox() As TextBox)
'内部の配列に参照を設定する
tb = formsTextBox
End Sub

'インデクサ
Default Property textBoxText(ByVal index As Integer) As String
Get
Return tb(index).Text
End Get

Set(ByVal value As String)
tb(index).Text = value
End Set
End Property
End Clas
このクラスは内部にテキストボックスの配列を持ち、コンストラクタに引数を指定して テキストボックスの配列の参照を保持します。

インデクサの書式
C# コード
public String  this[int index]
VB.NET コード
Default Property textBoxText(ByVal index As Integer) As String
上記がインデクサの設定です。
クラス名にC#は[]、VB.NETは()を付けて其の中に引数を設定すると、其の引数に従って、
C#は public String this[int index]が呼び出され、
VB.NETはDefault Property textBoxText(ByVal index As Integer) As Stringが呼び出されます。
そしてget(Get)又はset(Set)が実行されるのである。
この場合は引数に数値を設定すると、そのindexを持つTextBoxの配列の要素がsetで設定され
getで返されることになるのです。
もちろん引数には数値以外のObjectでも良く、其の処理も柔軟に書くことが可能です。

すなわちインデクサはC#の場合引数を持つプロパティと言えます。
C#の場合と書いたのは、VB.NETはもともと引数付きのプロパティを持ちます、 従ってVB.NETの場合はプロパティは配列で有るかの様な書き方は可能です。
しかしながらVB.NETの場合でもデフォルトプロパティを使うと、あたかもクラス 自信が配列の様な書き方が可能となります。

プログラムを走らせて、フォームの空いた場所をクリックして、テキストボックスの文字が 右側にシフトすることを確認してみてください。
このコードはインデクサによって、テキストの読み書きが行なわれるサンプルです。

(注意)
これを読まれた方の中には、
public ArryTextBox(TextBox[] formsTextBox )
Public Sub New(ByVal formsTextBox() As TextBox)
の様に値によって引き渡された関数が其の引数を変化させることは出来ないと考えられる 人がいるかも知れません。
しかし実際は値で引き渡されたテキストボックスのテキストを引き渡された側が変えています。
配列を関数に値渡しで渡した時は、配列のコピーが渡されるわけでは有りません。
渡されるのはあくまでも配列のポインターが値渡しで渡されるのです。
従ってこのポインターを使ってもとの配列を操作することは可能なのです。