よく知られている解決策は、プロキシ クラスを作成することです。
public class MyClass
{
public class MyPropProxy
{
private MyClass c;
// ctor etc.
public string this[int index]
{
get
{
return c.list[index];
}
set
{
c.list[index] = value;
}
}
}
private List<string> list;
private MyPropProxy myPropProxy;
// ctor etc.
public MyPropProxy MyProp
{
get
{
return myPropProxy;
}
}
}
しかし (これが実際に問題を解決することを除いて)、この解決策は主に短所のみをもたらします:
- これにより、(おそらく) 多くの小さなプロキシ クラスによってコードが汚染されます。
- 提示されたソリューションはカプセル化を少し破ります(内部クラスは外部クラスのプライベート メンバーにアクセスします)。より良いものは、 list のインスタンスを
MyPropProxy
の ctor に渡すことで、さらに多くのコードが必要になります。
- 内部ヘルパー クラスを公開することは、私が提案するものではありません。追加のインターフェースを導入することでそれを解決することもできますが、実装するエンティティが 1 つ増えます (テスト、保守など)。
ただし、別の方法があります。また、コードを少し汚染しますが、前のものよりも確実に少なくなります。
public interface IMyProp
{
string this[int index] { get; }
}
public class MyClass : IMyProp
{
private List<string> list;
string IMyProp.this[int index]
{
get
{
return list[index];
}
set
{
list[index] = value;
}
}
// ctor etc.
public IMyProp MyProp
{
get
{
return this;
}
}
}
長所:
- プロキシ クラス (メモリ内のスペースを占有し、単一の目的のみを果たし、(最も単純なソリューションでは) カプセル化を破る) はありません。
- シンプルなソリューション。別のインデックス付きプロパティを追加するためのコードはほとんど必要ありません
短所:
- プロパティごとに異なるパブリック インターフェイスが必要です
- インデックス付きプロパティの増加に伴い、クラスはますます多くのインターフェイスを実装します
これは、C# にインデックス付きプロパティを導入する最も簡単な (コードの長さと複雑さの点で) 方法です。もちろん、誰かがさらに短くて単純なものを投稿しない限り.