Ini adalah bentuk yang baik untuk melakukannya ketika anggota tidak ada artinya dalam konteks. Misalnya, jika Anda membuat koleksi hanya baca yang mengimplementasikan IList<T>
dengan mendelegasikan ke objek internal _wrapped
maka Anda mungkin memiliki sesuatu seperti:
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;
}
}
Di sini kita punya empat kasus berbeda.
public T this[int index]
didefinisikan oleh kelas kita daripada antarmuka, dan karenanya tentu saja bukan implementasi eksplisit, meskipun perhatikan bahwa itu memang mirip dengan baca-tulis yang T this[int index]
didefinisikan dalam antarmuka tetapi hanya baca-saja.
T IList<T>.this[int index]
eksplisit karena salah satu bagiannya (pengambil) sangat cocok dengan properti di atas, dan bagian lainnya akan selalu melemparkan pengecualian. Sementara penting bagi seseorang yang mengakses instance kelas ini melalui antarmuka, tidak ada gunanya bagi seseorang yang menggunakannya melalui variabel tipe kelas.
Demikian pula karena bool ICollection<T>.IsReadOnly
selalu akan mengembalikan true itu sama sekali tidak ada gunanya untuk kode yang ditulis terhadap tipe kelas, tetapi bisa sangat penting untuk menggunakannya melalui tipe antarmuka, dan oleh karena itu kami menerapkannya secara eksplisit.
Sebaliknya, public int Count
tidak diterapkan secara eksplisit karena berpotensi dapat digunakan untuk seseorang yang menggunakan instance melalui tipe sendiri.
Tetapi dengan kasus "sangat jarang digunakan" Anda, saya akan cenderung sangat kuat untuk tidak menggunakan implementasi eksplisit.
Dalam kasus di mana saya merekomendasikan menggunakan implementasi eksplisit memanggil metode melalui variabel dari tipe kelas akan menjadi kesalahan (mencoba untuk menggunakan setter yang diindeks) atau tidak berguna (memeriksa nilai yang akan selalu sama) sehingga dalam bersembunyi mereka Anda melindungi pengguna dari kode kereta atau sub-optimal. Itu sangat berbeda dengan kode yang Anda pikir cenderung jarang digunakan. Untuk itu saya mungkin mempertimbangkan untuk menggunakan EditorBrowsable
atribut untuk menyembunyikan anggota dari intellisense, meskipun bahkan saya akan bosan; otak orang sudah memiliki perangkat lunak mereka sendiri untuk menyaring apa yang tidak menarik bagi mereka.