メンバーが文脈上無意味な場合にそうするのは良い形です。たとえばIList<T>
、内部オブジェクトに委任することによって実装する読み取り専用コレクションを作成する場合、_wrapped
次のようなものがあります。
public T this[int index]
{
get
{
return _wrapped[index];
}
}
T IList<T>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
public int Count
{
get { return _wrapped.Count; }
}
bool ICollection<T>.IsReadOnly
{
get
{
return true;
}
}
ここには、4つの異なるケースがあります。
public T this[int index]
インターフェースではなくクラスによって定義されているため、もちろん明示的な実装ではありませんT this[int index]
が、インターフェースで定義された読み取り/書き込みに似ていますが、読み取り専用であることに注意してください。
T IList<T>.this[int index]
その一部(ゲッター)が上記のプロパティと完全に一致し、他の部分は常に例外をスローするため、明示的です。インターフェイスを介してこのクラスのインスタンスにアクセスする人にとっては重要ですが、クラスの型の変数を介してこのクラスのインスタンスを使用する人にとっては意味がありません。
同様に、bool ICollection<T>.IsReadOnly
常にtrueを返すため、クラスの型に対して記述されたコードにはまったく意味がありませんが、インターフェイスの型を介してそれを使用するために不可欠である可能性があるため、明示的に実装します。
逆に、public int Count
明示的に実装されていないのは、独自の型を介してインスタンスを使用しているユーザーにとって潜在的に有用である可能性があるためです。
しかし、「ごくまれにしか使用されない」場合は、明示的な実装を使用しないことに強く傾倒します。
クラスの型の変数を介してメソッドを呼び出す明示的な実装を使用することをお勧めする場合、エラー(インデックス付きセッターの使用を試みる)または無意味(常に同じ値をチェックする)になるため、非表示になりますバグのあるコードや次善のコードからユーザーを保護しています。これは、ほとんど使用されないと思われるコードとは大きく異なります。そのため、EditorBrowsable
属性を使用してメンバーをインテリセンスから隠すことを検討するかもしれませんが、それでも私は疲れます。人々の脳にはすでに、興味のないものを除外するための独自のソフトウェアがあります。