C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】[]演算子(インデクサー)をオーバーロードする方法をわかりやすく解説

C#における[]演算子(インデクサー)とは

C#で使われる[]演算子は、正式にはインデクサーと呼ばれます。

インデクサーを利用すると、配列とまったく同じ感覚でオブジェクトにインデックス経由でアクセスできるようになります。クラスにインデクサーを定義すると、そのクラスはあたかも仮想的な配列であるかのように振る舞い、配列アクセス演算子([ ])を使ってインスタンスの要素を読み書きすることが可能になります。

さらに重要なポイントとして、インデクサーはオーバーロード可能です。複数のパラメーターを持つインデクサーを宣言することもでき、各パラメーターには異なる型を指定できます。つまり、インデックスは必ずしも整数型である必要はありません。

例1:基本的なインデクサーの実装

次のコードでは、this[int i] というインデクサーを定義しています。Team[0] = "A"; のように、オブジェクトに対して配列形式で値の代入・取得が行えることが確認できます。

static void Main(string[] args){
    IndexerClass Team = new IndexerClass();
    Team[0] = "A";
    Team[1] = "B";
    Team[2] = "C";
    Team[3] = "D";
    Team[4] = "E";
    Team[5] = "F";
    Team[6] = "G";
    Team[7] = "H";
    Team[8] = "I";
    Team[9] = "J";
    for (int i = 0; i < 10; i++){
        Console.WriteLine(Team[i]);
    }
    Console.ReadLine();
}
class IndexerClass{
    private string[] names = new string[10];
    public string this[int i]{
        get{
            return names[i];
        } set {
            names[i] = value;
        }
    }
}

出力結果

A
B
C
D
E
F
G
H
I
J

例2:[]演算子のオーバーロード

[]演算子をオーバーロードするには、同じクラス内にパラメーターの型が異なるインデクサーを追加で定義します。

以下の例では、int型のインデクサーに加えて、文字列を検索キーとして受け取るstring型のインデクサーを定義しています。Team["C"] のように記述すると、内部の配列から "C" に一致する最初の要素をLINQの FirstOrDefault() で検索して返します。

static class Program{
    static void Main(string[] args){
        IndexerClass Team = new IndexerClass();
        Team[0] = "A";
        Team[1] = "B";
        Team[2] = "C";
        for (int i = 0; i < 10; i++){
            Console.WriteLine(Team[i]);
        }
        System.Console.WriteLine(Team["C"]);
        Console.ReadLine();
    }
}
class IndexerClass{
    private string[] names = new string[10];
    public string this[int i]{
        get{
            return names[i];
        }
        set{
            names[i] = value;
        }
    }
    public string this[string i]{
        get{
            return names.Where(x => x == i).FirstOrDefault();
        }
    }
}

出力結果

A
B
C
C

最後の行に出力されている「C」は、string型のインデクサーによって Team["C"] を検索した結果です。このように、パラメーターの型を変えたインデクサーを複数定義することで、[]演算子を柔軟にオーバーロードできます。

  1. Pythonのタプルで*演算子(アスタリスク)はどのように機能するのか?

    Pythonの*演算子は、シーケンスやコレクションの中身を「展開(アンパック)」し、個々の要素を位置引数として関数に渡すためのものです。たとえば、タプルの各要素をその並び順どおりに関数の引数として渡したい場合、通常ならインデックスを使ってvalues[0]、values[1]のように一つずつ指定する必要があります。しかし、*演算子を使えば、タプル名の前に*を付けるだけで、要素が自動的に展開されて渡されます。使用例次のコードでは、2つの引数を受け取って掛け算をするmultiply関数に対し、タプルvaluesの要素を*演算子で展開して渡しています。def multiply(a, b):

  2. Rubyの三項演算子(?:)の使い方を徹底解説!基本構文から注意点まで

    Rubyの三項演算子とは? 三項演算子は「3つの部分」で構成される演算子で、「三項(ternary)」という名前もここから来ています。具体的には、条件式と2つの結果候補から成り立ちます。 つまり、三項演算子を使えば、通常複数行になるif/else文をたった1行のコンパクトなコードにまとめられるのです。 例えば、次のようなコードが… 1 :eat_apple else :buy_apple end このように書けます: 1 ? :eat_apple : :buy_apple これが三項演算子の力です。 では、具体的にどのように動作するのか、正しい構文はどうなっているのかを見ていき