2010-07-11 33 views

Antwort

17

Ja, in diesem Fall macht es keinen Unterschied. In einigen Fällen kann es Unterschied machen, wenn Sie eine Basisklasse verwenden, die bereits eine Schnittstelle implementiert, aber Sie möchten es explizit erneut implementieren - aber in diesem Fall gibt es keine Basisklasse (außer der impliziten object) und es hätte sich genau so verhalten.

Im Gegensatz zu meinen Erinnerungen glaube ich nicht, gibt es einen Unterschied in der Art, wie die Klasse in Metadaten dargestellt wird, ob der Code explizit alle Schnittstellen deklariert oder nicht. Hier ein Beispiel:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

Sowohl ildasm und Reflector zeigt die gleichen Informationen für FooBar1 und FooBar2 ... es zeigt beide Umsetzung IBar und IFoo.

Mit anderen Worten, wir können nicht sagen, ob der ursprüngliche Quellcode für List<T> tatsächlich alle Schnittstellen angibt oder nicht. Vielleicht tut es das, vielleicht auch nicht - aber egal.

BEARBEITEN: Aus Gründen der Vollständigkeit habe ich auch die Fälle überprüft, in denen Sie zwei Schnittstellen mit einer anderen Schnittstelle erweitern. Ich finde auch keinen Unterschied in den Metadaten in diesem Fall. Ich bin mir sicher, dass ich mich an eine Situation erinnere, in der es offensichtlich war, aber ich kann sie jetzt nicht finden.

+0

Also da gibt es keine Basisklasse. Es macht keinen Unterschied. Warum haben die Entwickler dann diese beiden Schnittstellen "wieder" geerbt? –

+0

@Marco: Siehe meine bearbeitete Antwort. –

+0

Verstanden. Vielen Dank. Das war schnell. –

5

Ja würde es. IList<T> selbst implementiert die anderen beiden.

Der Objekt-Browser zeigt Ihnen alle die Schnittstellen implementiert die Klasse an, die unmittelbar (IList<T>) oder indirekt (ICollection<T>, IEnumerable<T>, durchIList<T>).

+0

Sie meinen, es ist nur ein Trick, den der Objektbrowser macht, um uns die Dinge zu erleichtern? –

+0

Nun, wenn Sie es so sagen wollen. Ich denke wirklich, es liegt daran, dass der Code des Browsers einfach alle implementierten Schnittstellen auflistet, ohne sich darum zu kümmern, die von anderen erweiterten zu filtern. – Mau

3

So wurde es hinter den Kulissen eigentlich nicht codiert. Das ist genau das, was Werkzeuge wie Reflector zeigen, wenn es die IL wieder in C# verwandelt.

+0

Sie können es auch in Code Viewer sehen. – Incognito

+0

@Incognito: Codeviewer erzeugt es aus Metadaten auf dieselbe Weise wie Reflektor. – EFraim

Verwandte Themen