![]() | インデクサ |
|
インデクサとは?
インデクサとは何であろうか?
文字列の中から文字を取得するインデクサ
C# コード
string s = "ABCDE";上のコードを見て欲しい、文字列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#コード
//テキストボックスの配列 VB.NETコード
'テキストボックスの配列
先ずテキストボックスの配列を宣言し、其のテキストボックスの配列全体の参照を格納するクラスを
宣言する。
tBox[](tBox())はテキストボックスの配列で有り、aBoxはその配列全体の参照を持つクラスである。 aBoxに関しては後に説明する。 先ずテキストボックスを5つ作成して、テキストボックスの配列に入れる。 次に作成したテキストボックスを横に並べます。 最後に C#コード
aBox = new ArryTextBox(tBox);
VB.NETコード
aBox = New ArryTextBox(tBox)
で配列全体をあるクラスに入れます。(ここは後で説明する)
クリックイベント
フォーム上のクリックによりTexBoxに表示されている文字が右にシフトするコードを示します。
C#コード
//フォームをクリックするとテキストボックスの文字が移動する VB.NETコード
'テキストボックスを継承したテキストボックスの配列
さてこのコードはフォームの空いた場所をクリックするとテキストボックスが右にシフトするコードで有るが
肝心なのは
C#コード
aBox[i + 1] = aBox[i]; VB.NETコード
aBox(i + 1) = aBox(i)
この部分で有り、注目すべきはaBoxはテキストボックスクラスであるが、それがあたかも文字列の配列の様に
読み書きされている点であります。
これがインデクサです。 そして其の秘密はaBoxクラスの中に有るのです。 インデクサ(デフォルトプロパティを内蔵したクラス)
C#コード
//テキストボックスの配列を持つクラス VB.NETコード
'テキストボックスの配列を持つクラス
このクラスは内部にテキストボックスの配列を持ち、コンストラクタに引数を指定して
テキストボックスの配列の参照を保持します。
インデクサの書式
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) の様に値によって引き渡された関数が其の引数を変化させることは出来ないと考えられる 人がいるかも知れません。 しかし実際は値で引き渡されたテキストボックスのテキストを引き渡された側が変えています。 配列を関数に値渡しで渡した時は、配列のコピーが渡されるわけでは有りません。 渡されるのはあくまでも配列のポインターが値渡しで渡されるのです。 従ってこのポインターを使ってもとの配列を操作することは可能なのです。 |