Jest to dobra forma, aby zrobić to, gdy członek jest bezcelowy w kontekście. Na przykład, jeśli utworzysz kolekcję tylko do odczytu, która implementuje się IList<T>
przez delegowanie do obiektu wewnętrznego, _wrapped
możesz mieć coś takiego:
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;
}
}
Tutaj mamy cztery różne przypadki.
public T this[int index]
jest zdefiniowany przez naszą klasę, a nie przez interfejs, a zatem nie jest oczywiście jawną implementacją, choć zauważ, że jest podobny do odczytu-zapisu T this[int index]
zdefiniowanego w interfejsie, ale jest tylko do odczytu.
T IList<T>.this[int index]
jest jawny, ponieważ jedna jego część (getter) jest idealnie dopasowana do powyższej właściwości, a druga część zawsze zgłasza wyjątek. Chociaż jest to niezbędne dla kogoś, kto uzyskuje dostęp do instancji tej klasy za pośrednictwem interfejsu, nie ma sensu, aby ktoś używał jej za pośrednictwem zmiennej typu klasy.
Podobnie, ponieważ bool ICollection<T>.IsReadOnly
zawsze będzie zwracać wartość true, absolutnie bezcelowe jest pisanie kodu przeciw typowi klasy, ale może mieć to zasadnicze znaczenie przy używaniu go przez typ interfejsu, dlatego też implementujemy go jawnie.
I odwrotnie, public int Count
nie jest jawnie zaimplementowany, ponieważ może potencjalnie być użyteczny dla kogoś, kto korzysta z instancji za pośrednictwem własnego typu.
Ale w twoim przypadku „bardzo rzadko używanym” bardzo mocno skłaniałbym się ku nieużywaniu wyraźnej implementacji.
W przypadkach, w których zalecam użycie jawnej implementacji wywołanie metody przez zmienną typu klasy byłoby albo błędem (próba użycia indeksowanego setera), albo bezcelowym (sprawdzenie wartości, która zawsze będzie taka sama), więc ukrywanie chronisz użytkownika przed błędnym lub nieoptymalnym kodem. To znacznie różni się od kodu, który Twoim zdaniem jest rzadko używany. W tym celu mógłbym rozważyć użycie tego EditorBrowsable
atrybutu, aby ukryć członka przed inteligencją, choć i tak byłbym zmęczony; mózgi ludzi mają już własne oprogramowanie do filtrowania tego, co ich nie interesuje.