DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インデクサ、アクセサについて

環境/言語:[c#2005]
分類:[その他]

C#2005を勉強中です。
インデクサ、アクセサの概念がよくわかりかねます。
また、これらは、別のフォームでの値のやり取り以外にどのような
場面で使用すると効率的なプログラムになるのでしょうか?
2008/01/20(Sun) 00:31:09 編集(投稿者)

■No21299に返信(kenさんの記事)
> C#2005を勉強中です。
> インデクサ、アクセサの概念がよくわかりかねます。
> また、これらは、別のフォームでの値のやり取り以外にどのような
> 場面で使用すると効率的なプログラムになるのでしょうか?

プロパティはわかりますか?

プロパティ (C# プログラミング ガイド)
http://msdn2.microsoft.com/ja-jp/library/x9fsa0sw(VS.80).aspx

カプセル化で隠されているオブジェクトの内部のフィールドにアクセスするものです。
使う側のプログラムコードからみるとフィールドのように使用できます。
使われる側のクラスの定義からみるとメソッドのように処理を記述できます。
フィールド値の取得時や設定時に何か処理したい時に何か処理を加えたい場合に使用できます。
その処理を記述する部分「get」や「set」のことを「アクセサ」と呼びます。
この中の記述方法はメソッドと同じです。
setの方は使う側のプログラムからセットされた値をあらわす特殊な変数「value」があります。

インデクサ (C# プログラミング ガイド)
http://msdn2.microsoft.com/ja-jp/library/6x16t2tx(VS.80).aspx

についても同じようなものです。
使う側のプログラムコードからあたかも配列のようにインデックスを使って内部のフィールドにアクセスできるメンバです。
または、「辞書」のようにキーとなる文字列から対応するオブジェクトの内部のフィールドにアクセスさせるように使うこともできます。
プロパティ同様にアクセサ「get」や「set」があります。
C#の場合はインデックス付のプロパティがありませんのでその変わりにインデクサを使います。

もともと.NETに用意されているクラスにもインデクサが定義されているものがあります。
以下の様にstringオブジェクトやStringBuilderオブジェクトの中の文字を配列のようにインデックスを指定して取扱えます。

string str = "abcdefg";
Console.WriteLine(str[str.Length-1]); //「g」が出力される
StringBuilder sb = new StringBuilder(str);
sb[0] = 'A';
Console.WriteLine(sb.ToString()); //「Abcdefg」が出力される

String.Chars プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.string.chars(VS.80).aspx
StringBuilder.Chars プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.text.stringbuilder.chars(VS.80).aspx

> 効率的なプログラムになるのでしょうか?

実行速度が上がることはありませんが、理解していればわかりやすい簡潔なコードが書けるので開発の効率は上がる可能性はあります。


関連するMSDNライブラリ(ヘルプ)のリンク

インデクサの使用 (C# プログラミング ガイド)
http://msdn2.microsoft.com/ja-jp/library/2549tw02(VS.80).aspx

get (C# リファレンス)
http://msdn2.microsoft.com/ja-jp/library/ms228503(VS.80).aspx
set (C# リファレンス)
http://msdn2.microsoft.com/ja-jp/library/ms228368(VS.80).aspx

プロパティとインデクサの比較 (C# プログラミング ガイド)
http://msdn2.microsoft.com/ja-jp/library/4bsztef7(VS.80).aspx
インデクサのサンプル
http://msdn2.microsoft.com/ja-jp/library/b75y0xk8(VS.80).aspx
C# の高度な手法 (C# と Java の比較)
http://msdn2.microsoft.com/ja-jp/library/ms228395(vs.80).aspx
■No21300に返信(IIJIMASさんの記事)
たくさんの情報有り難うございます。がんばって勉強したいと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板