daiki130412
@daiki130412 (だいち)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

Q&A

Closed

C#ではインデクサによって、指定したインデックスの要素を取得することができると学びました。

Listや配列で使っていますが、参考書では自作のインデクサを紹介しているところが多く見られます。(this~ の構文)

この構文を用いる利点を知りたいです。わざわざ、例えば string のコレクションをメンバ変数に持つクラス(インデクサを自作したクラス)を作らなくても、List〈string〉でインデクサを使うことができ、事足りる気がします。

ご回答のほど、よろしくお願いします。

0

1Answer

単純に、あった方が文法として楽に書けるからじゃないですかね。
インデクサ無かったら、あなたの挙げてるそのListクラスもいちいちメソッド経由で要素にアクセスしないといけなくなります。

1Like

Comments

  1. @daiki130412

    Questioner

    もう少し説明をいただいてもよろしいですか?

    例えば、
    List〈string〉 strings = new List〈string〉() {“a”,“b”,“c”,“d”,“e”,};
    としても、strings[int index]で要素にアクセスできると思ってます。

    このため、自分でインデクサを実装すること(string this[])に利点が見出せずにいます。自分で何らかのクラスを作るよりも、ジェネリックのList〈T〉で充分と感じていますが、追加の説明をいただいてもよろしいでしょうか?

  2. 使ったことありませんが、公式をみるとインデクサーはプロパティに似ているので、プロパティの利点があると思います。
    例えば、getだけ、setだけ。他にはset内にログ出力やイベント通知といった処理を追加できます。
    https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/indexers/

    以下、ひとりめの回答者がされている
    >Listクラスもいちいちメソッド経由で要素にアクセスしないといけなくなります。
    という部分のわたしの解釈ですが。。

    class AlphabetClass
    {
    private List〈string〉 strings = new List〈string〉() {“a”,“b”,“c”,“d”,“e”,};
    // stringsの要素をAlphabetClass[1]でアクセスするインデクサーにするのか、GetString(int i)というメソッドを作るのか
    }

    Listをpublicにしても良いですが、制御をクラス内で完結できない問題がありそうです。
    例えば、Listのstringsはa~zの26文字しか扱えない制限があった場合、AlphabetClass自身が26文字制限を管理しておけば、AlphabetClassを使う側が気にしないでよくなります。

  3. @daiki130412

    Questioner

    ありがとうございます!
    非常に参考になりました!

  4. 実際のところListの機能で足りるならばListで十分で、アプリケーション作成者の視点だと、インデクサを自作したいというケースはあまり無いかもしれませんが、クラスライブラリ作成者の視点だと、もっと高機能、もしくは違った機能を持ったコレクション的なクラス・構造体を作るためにインデクサを自作したいケースは時々あります。

    その場合、Listを継承すればいいのでは?と思われるかもしれませんが、Listの機能全てが必要じゃない場合もあるかもしれないし、継承するとListに依存してしまうので抽象度が下がります。

    @goban35 さんのプロパティという表現が出てきましたが、まさにインデクサは引数付きプロパティのように機能するので、内部の実装を隠蔽できるという利点があり、中で配列を使おうがListを使おうが自由です。

Your answer might help someone💌