インデクサの小さなサンプル
インデクサとは
インデクサとは、クラスや構造体などのインスタンスに対して、配列のようにインデックスを指定してアクセスするための機能です。インデクサを使うことで、配列のように要素を読み書きすることができます。
インデクサは、添え字付きプロパティとも呼ばれます。通常のプロパティと同様に、getアクセサとsetアクセサを定義することができます。インデクサの添え字の型や数は任意で定義することができます。例えば、int型の添え字1つでアクセスするインデクサや、string型の添え字2つでアクセスするインデクサなどがあります。
サンプル
以下は、int型の添え字を使ってアクセスする例です。
コンソール画面に結果は表示されません
MyClass myClass = new MyClass();
myClass[0] = 10;
int x = myClass[0];
public class MyClass
{
private int[] data = new int[10];
public int this[int index]
{
get { return data[index]; }
set { data[index] = value; }
}
}
MyClass
クラスにはインデクサーが定義されており、これを使って内部の配列data
にアクセスしています。コードの動作を順に説明します。
MyClass myClass = new MyClass();
MyClass
型のmyClass
という名前のインスタンスを生成しています。
myClass[0] = 10;
myClass
オブジェクトのインデクサーを使用して、内部配列data
の0番目の要素に10
を代入しています。インデクサーのset
アクセサが呼ばれます。
int x = myClass[0];
myClass
オブジェクトのインデクサーを使用して、内部配列data
の0番目の要素を取得し、それを整数型の変数x
に代入しています。この時、インデクサーのget
アクセサが呼ばれます。
MyClass
クラスの説明:
private int[] data = new int[10];
MyClass
内にdata
という名前のint
型の配列をプライベート変数として宣言し、10要素分の領域を確保しています。
public int this[int index]
- これはインデクサーの定義です。インデクサーを使用すると、オブジェクトを配列のように扱うことができます。このインデクサーは整数型のインデックスを受け取り、そのインデックスに対応する
data
配列の要素にアクセスします。get { return data[index]; }
get
アクセサは、指定されたインデックスにある値を返します。
set { data[index] = value; }
set
アクセサは、指定されたインデックスに値を設定します。value
キーワードは、設定される値を表します。
- これはインデクサーの定義です。インデクサーを使用すると、オブジェクトを配列のように扱うことができます。このインデクサーは整数型のインデックスを受け取り、そのインデックスに対応する
この機能はC#の便利な特性の一つで、オブジェクト内のデータに対する直接的なアクセスを提供しながら、そのデータへのアクセスを制御することができます。インデクサーを使用することで、配列やコレクションへのアクセスをより直感的に行うことが可能になります。
(参考).NETフレームワーク内でインデクサが使われているクラス
.NETフレームワーク内でインデクサが使われているクラスは多数存在します。これらのクラスは、コレクション、リスト、ディクショナリなど、要素の集合を扱う際に特に役立ちます。以下にいくつかの代表的な例を挙げます。
- List<T> クラス
List<T>
は汎用のリストコレクションを表すクラスで、T
はリスト内の要素の型を指定します。インデクサを使用してリスト内の特定の位置にある要素にアクセスできます。
- Dictionary<TKey, TValue> クラス
Dictionary<TKey, TValue>
はキーと値のペアを格納するコレクションです。インデクサを使用して、特定のキーに対応する値にアクセスできます。
- Array クラス
- 配列は.NETの基本的なデータ構造で、固定長の同一型の要素を連続して格納します。インデクサを使用して、任意の位置の要素にアクセスすることができます。
- DataTable クラス
DataTable
はデータのメモリ内表現を提供し、データベースのテーブルのように機能します。行(DataRow
)や列(DataColumn
)へのアクセスにインデクサを使用することができます。
- String クラス
String
クラスもインデクサを使っています。特定の位置にある文字にアクセスするためにインデクサが使用されますが、String
クラスのインデクサは読み取り専用です。
これらのクラスは、.NETフレームワークで一般的に使用されるデータ構造を扱うためのものであり、インデクサを通じて、要素への簡単かつ直感的なアクセスを提供しています。インデクサを利用することで、コードがより読みやすく、書きやすくなることが多いです。
(学習)Stringクラスでのどのように実装されている?
String
クラスのインデクサの実装を模倣するサンプルコードを書くことは、String
クラスの内部動作を理解する上で役立つかもしれません。ただし、実際のString
クラスは.NETフレームワーク内部で高度に最適化されており、ここで示すのはあくまで概念的なシミュレーションです。
以下のコードは、String
クラスにおける読み取り専用インデクサの振る舞いをシンプルなカスタムクラスで模倣しています。このクラスは、内部にchar
型の配列を持ち、インデクサを通じてその配列の特定の要素にアクセスできるようにします。
MyString myString = new MyString("Hello, World!");
char letter = myString[7]; // 8番目の文字にアクセス
Console.WriteLine(letter); // 出力: W
public class MyString
{
private char[] characters;
public MyString(string initialString)
{
characters = initialString.ToCharArray();
}
public char this[int index]
{
get
{
if (index < 0 || index >= characters.Length)
{
throw new IndexOutOfRangeException("Index out of range.");
}
return characters[index];
}
}
}
このコードは、C#で書かれたシンプルなカスタム文字列クラスMyString
の実装と使用例を示しています。このクラスは、.NETのString
クラスの一部の機能を模倣していますが、基本的な機能のみを持っています。コードの各部分を詳しく説明します。
クラス定義とコンストラクタ
public class MyString
MyString
という名前のクラスを定義しています。このクラスは、内部的に文字の配列を持ち、与えられた文字列をこの配列に格納します。
private char[] characters;
char
型の配列characters
をプライベート変数として宣言しています。この配列は、クラスのインスタンスに割り当てられた文字列の各文字を保持します。
public MyString(string initialString)
MyString
クラスのコンストラクタです。文字列を引数として受け取り、その文字列をchar
型の配列に変換してcharacters
配列に格納します。
インデクサ
public char this[int index]
- クラスにインデクサを定義しています。インデクサは、オブジェクトを配列のように扱うことを可能にします。このインデクサは整数型の
index
を引数とし、そのインデックスにある文字を返します。
- クラスにインデクサを定義しています。インデクサは、オブジェクトを配列のように扱うことを可能にします。このインデクサは整数型の
get { ... }
- インデクサの
get
アクセサです。指定されたインデックスが配列の範囲内にある場合は、その位置の文字を返します。範囲外の場合はIndexOutOfRangeException
をスローします。
- インデクサの
使用例
MyString myString = new MyString("Hello, World!");
MyString
クラスのインスタンスを作成し、初期文字列"Hello, World!"
を渡しています。
char letter = myString[7];
- 作成した
myString
オブジェクトの7番目のインデックス(つまり8番目の文字、プログラミングでは0から数えるため)にアクセスし、その文字(この場合は'W'
)を変数letter
に格納しています。
- 作成した
Console.WriteLine(letter);
letter
変数に格納された文字('W'
)をコンソールに出力しています。
このコードの目的は、カスタム文字列クラスを定義し、そのクラスのインデクサを通じて特定の文字にアクセスする方法を示すことにあります。このようなカスタムクラスは、.NETの既存のクラスの機能を拡張したり、特定のアプリケーションに特化した動作を実装したい場合に役立ちます。
ディスカッション
コメント一覧
まだ、コメントがありません