1

すべて、私は次のプロパティとオブジェクトの宣言に出くわしました。1つ目はインターフェースを返し、2つ目はあまりよくわかりません

public IConfig this[int index]
{
    get { return (IConfig)configList[index]; }
}

object IList.this[int index]
{
    get { return configList[index]; }
    set {  }
}

私はこのタイプの宣言、つまりpublic IConfig this[int index]角括弧付きととの奇妙な使用法を見たことがthisありませんobject IList.this[int index]。誰かが2つの表記法を説明できますか?

持っている本を調べてGoogleを使ってみましたが、何を探しているのかわかりません。御時間ありがとうございます。

編集。これらは、次のように継承するクラスにあります

public class ConfigCollection : ICollection, IEnumerable, IList
{
    ....
}
4

3 に答える 3

12

これは an と呼ばれ、オブジェクトから要素を取得するときindexerに実行できます。instance[1];この回答をimplementing IList参照として見ることができます

于 2012-11-02T17:18:22.023 に答える
3

また、Johan の投稿にもう 1 つ詳細を追加したいと思います。実際には、複数のインターフェイスがあるため、そのクラスで 2 つのインデクサーが実行されています。

から実装されるインデクサーはIList明示的に宣言されているため、これはデフォルトでは呼び出されません。インデクサーのバージョンを使用する場合はIList、次のようにする必要があります。

ConfigCollection thisCollection = GetCollectionItems();

// this invokes the IList.this indexer....
var firstItem = ((IList)thisCollection)[0];  

// this invokes the other indexer
var firstItemAsIConfig = thisCollection[0];

IList.thisあなたが私たちと共有したコードに基づいて、インデクサーは冗長だと思います。

于 2012-11-02T17:25:20.990 に答える
1

持っていたと言う

public class MyAggregate
{
  private List<String> _things;
  public MyAggregate()
  {
    _things = new List<String>();
  }
}

だからあなたは追加することができます

public String GetItem(int argIndex)
{
  return _things[argIndex];
}

public void SetItem(int argIndex, String argValue)
{
  _things[argIndex] = argValue;
}

を介してアクセスし、myAggregate.GetItem(0)それを取得しmyAggregate.SetItem(0,"Thing")て設定します。

または追加できます

public string this[int argIndex] 
{
  get {return _things[argIndex];}
  set { _things[argIndex] = value;}
}

アクセスしmyAggregate[0]て取得し、myAggregate[0] = "Thing"設定します。

後者はより自然に感じる傾向があり、毎回 2 つのメソッド名を思いつく必要はありません。

于 2012-11-02T17:41:07.153 に答える