LoginSignup
21
20

More than 5 years have passed since last update.

C#-インデクサ について

Last updated at Posted at 2016-08-04

インデクサ使って実装できたらかっこいい気がするなーと思ったのでちょっとだけ調べてみました。

インデクサとは?

インデクサ = indexer
インデクサを使うとオブジェクトを配列やListのように扱うことができるようになります。
インデクサはプロパティと似ている。

こんな感じでデータにアクセスできるようになります。
        MonsterManager manager = new MonsterManager ();
        var monster = manager [0, "hoge"];
        var monster2 = manager [0];

実装コード

インデクサを実装しているMonsterManager
using System.Collections.Generic;
using System;
using UnityEngine;

public class MonsterManager
{
    [SerializeField]
    private List<Monster> monsterList = new List<Monster> ();

    public MonsterManager ()
    {
        monsterList.Add (new Monster ("くっぱ"));
        monsterList.Add (new Monster ("すらいむ"));
        monsterList.Add (new Monster ("とろーる"));
    }

    public Monster this [int index] {
        get {
            return monsterList [index];
        }
        set {
            monsterList.Add (value);
        }
    }

    [Serializable]
    public class Monster
    {
        public Monster (string name)
        {
            Name = name;
        }

        public int Hp {
            get;
            set;
        }

        public int Atk {
            get;
            set;
        }

        public string Name {
            get;
            set;
        }

        public override string ToString ()
        {
            return "Monster:" + Name;
        }
    }
}
インデクサを使ってMonsterにアクセス
    void Start ()
    {
        MonsterManager manager = new MonsterManager ();
        var monster = manager [0];
        Debug.Log (monster.ToString ());
    }

なんかちょっとかっこいい

インデクサの実装方法

基礎文法
要素型 this[int index]
{
    get
    {
        return 要素[index];
    }
    set
    {
        要素.add(value);
    }
}
  • インデクサに名前をつけることはできません。
  • getでは要素型を返す必要があります。
  • setでは要素型のvalue変数が渡ってきます。
  • this[int index]の[int index]はintである必要はありません。別の型でOKですし、2つ以上あっても大丈夫です。
  • インデクサはオーバーライドオーバーロード(間違えちゃいけない;;)することができます。
2種類のインデクサを実装することも可能
    public Monster this [int index, string name] {
        get {
            return monsterList [index];
        }
        set {
            monsterList.Add (value);
        }
    }

    public Monster this [int index] {
        get {
            return monsterList [index];
        }
        set {
            monsterList.Add (value);
        }
    }
インデクサを使ってアクセス
        MonsterManager manager = new MonsterManager ();
        var monster = manager [0, "hoge"];
        var monster2 = manager [0];

うーん、かっこいい。
が、使い慣れていないと混乱を生む可能性がたかいな

21
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20