Es ist eine gute Form, dies zu tun, wenn das Mitglied im Kontext sinnlos ist. Wenn Sie beispielsweise eine schreibgeschützte Auflistung erstellen, die IList<T>
durch Delegieren an ein internes Objekt implementiert wird, _wrapped
haben Sie möglicherweise Folgendes :
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;
}
}
Hier haben wir vier verschiedene Fälle.
public T this[int index]
wird eher von unserer Klasse als von der Schnittstelle definiert und ist daher natürlich keine explizite Implementierung. Beachten Sie jedoch, dass es dem T this[int index]
in der Schnittstelle definierten Lese- / Schreibzugriff ähnelt, jedoch schreibgeschützt ist.
T IList<T>.this[int index]
ist explizit, weil ein Teil davon (der Getter) perfekt mit der obigen Eigenschaft übereinstimmt und der andere Teil immer eine Ausnahme auslöst. Während dies für jemanden wichtig ist, der über die Schnittstelle auf eine Instanz dieser Klasse zugreift, ist es für jemanden, der sie über eine Variable des Klassentyps verwendet, sinnlos.
Da bool ICollection<T>.IsReadOnly
immer true zurückgegeben wird, ist es völlig sinnlos, Code zu verwenden, der für den Typ der Klasse geschrieben wurde, kann jedoch für die Verwendung über den Typ der Schnittstelle von entscheidender Bedeutung sein. Daher implementieren wir ihn explizit.
Wird dagegen public int Count
nicht explizit implementiert, da es möglicherweise für jemanden von Nutzen sein kann, der eine Instanz über ihren eigenen Typ verwendet.
Aber mit Ihrem "sehr selten verwendeten" Fall würde ich mich sehr stark dafür einsetzen, keine explizite Implementierung zu verwenden.
In den Fällen, in denen ich die Verwendung einer expliziten Implementierung empfehle, die die Methode über eine Variable des Klassentyps aufruft, wäre dies entweder ein Fehler (Versuch, den indizierten Setter zu verwenden) oder sinnlos (Überprüfung eines Werts, der immer derselbe ist) Sie schützen den Benutzer vor fehlerhaftem oder nicht optimalem Code. Dies unterscheidet sich erheblich von Code, von dem Sie glauben, dass er nur selten verwendet wird. Dafür könnte ich erwägen, das EditorBrowsable
Attribut zu verwenden, um das Mitglied vor dem Verstand zu verbergen, obwohl selbst ich es müde wäre; Die Gehirne der Menschen haben bereits eine eigene Software, mit der sie herausfiltern können, was sie nicht interessiert.