Frage

Ich war vor kurzem gefragt jemand, warum er eine stark typisierte Array über eine IList zurückzukehren bevorzugt. Ich hatte immer gedacht, dass die Programmierung gegen eine Schnittstelle war das flexibelste und beste Weg, Programm, wenn es mit einem Projekt mit einer langen Lebensdauer konfrontiert. So fiel es mir seltsam vor, als er antwortete:

  

Wir bevorzugen normalerweise unveränderliche Typen   über wandelbar diejenigen. Arrays sind   unveränderlich. IList nicht.

Ich bin nicht ganz sicher, ob ich diese Aussage zu verstehen. Kann mir jemand dabei helfen zu klären?

Danke für jede Hilfe euch zur Verfügung stellen kann.

War es hilfreich?

Lösung

Ich glaube, er vielleicht gedacht, da eine Eigenschaft length des Arrays unveränderlich ist, dann irgendwie Arrays sind mehr unveränderlich als IList oder vielleicht benutzte er das falsche Wort und vertauscht Beton mit unveränderlich. Wer weiß, aber es ist eine seltsame Antwort.

Ich denke, eine Liste mit Rückkehr etwas leicht ist angedeutet, dass es in Ordnung ist, es zu ändern, oder dass es ändern kann, während ein Feld zurückgibt, bedeutet nicht, dass so viel.

Zum Beispiel, wenn Sie ein Objektmodell auf einen Repository und haben ein Verfahren wie GetCars (), das eine Liste und einen Junior-Programmierer sah cars.Add (Car c) zurückgekehrt ... Würden Sie denken, er war völlig verrückt für cars.Add (neues Auto ()) denken tatsächlich ein Auto in das Repository hinzufügen könnte? Arrays sind nur von Natur aus mehr explizit.

ich glaube, Liste Verwendung geeignetere in Eigenschaften ist, wie Page.Controls.Add

ziehe ich Arrays häufiger als Liste aus mehreren Gründen zurück.

  • Habit. Kollektionen in 1.0 / 1.1 GELUTSCHT

  • ich es vorziehen, dass meine Methoden die einfachste und leichteste Objekt zurückgeben sie können. Wenn ich brauche einen Array mit einer Liste, um es trivial ist.

  • Sie können in .net 1.1 verwendet werden, und es reduziert die Oberfläche des Refactoring sind, wenn ich jemals kann ich zumindest einen Teil meines Codes oder anwenden ein identisches Objektmodell wiederverwendet werden benötigt, um ältere Versionen der Laufzeit zu unterstützen.

Andere Tipps

Wer „er“ ist, ist in 100% auf das Thema falsch. Arrays sind ein sehr wandelbar. Dies ist in der Tat einer der Gründe, nicht einen Array zurück. Es gibt keine Möglichkeit, einen Anrufer aus Ändern der Elemente eines Arrays zu verhindern, was auch immer sie wollen.

Der einzige Weg, in dem ein Arrray unveränderlich ist, ist in ihrer Gesamtlänge. Sobald ein Array zugeordnet ist, es Länge kann nicht geändert werden. Auch APIs wie Array.Resize nicht wirklich das Array der Größe, sie einfach einen neues zuweisen, um den Inhalt kopieren und das neue Array zurück (durch Bezugnahme in diesem Fall).

Ich stimme jedoch, dass es viele Fälle, in denen es besser ist, zu unveränderlichen Daten zurückzukehren. Die primäre ist, dass es einen Verweis auf eine interne Erhebung einer Klasse zurückkehren kann, ohne dabei die Anrufer zu verhindern, dass Messing mit Ihrem inneren Zustand eine vollständige Kopie und zugleich. Die meisten wandelbar Sammlungen können nicht solche Garantien machen.

Ich habe immer lieber eine Readonlycollection. Alle Vorteile einer Liste, aber Read Only.

Ein Punkt er gemeint haben könnte, ist, dass IList das Insert enthält, Entfernen und Hinzufügen Methoden, so die Sammlung selbst modifiziert werden kann. T [], auf der anderen Seite kann nicht Elemente hinzugefügt haben.

sollte ich hinzufügen, dass FxCop statt Readonlycollection Rückkehr empfiehlt. Der Indexer schreibgeschützt ist, so können Sie die Elemente nicht ändern und das Hinzufügen und andere solche Verfahren alle throw NotSupportedException.

Im Prinzip hat er recht, aber er weiß nicht, wie man es richtig zu üben ...

  

Wir bevorzugen normalerweise unveränderliche Typen   über wandelbar diejenigen.

Das ist richtig. Unveränderliche Typen sind schöner, mit zu arbeiten

  

Arrays sind unveränderlich. IList nicht.

Das ist nicht richtig. Keiner von denen sind unveränderlich.

Wenn Sie eine Sammlung zurückgeben mögen, unveränderlich ist, gibt ein IEnumerable<T> oder ein ReadOnlyCollection<T> (mit der List<T>.AsReadOnly Methode). Noch diejenigen schützen, nicht die Objekte, wenn sie sich nicht unveränderlich sind. Eventhough Sie nur aus den Sammlungen lesen können, können Sie immer noch die Daten in jedes Objekt ändern, wenn sie es zulassen.

Außerdem sollten Sie das „Eigentum“ der Sammlung betrachten, die Sie zurückgeben. Wenn Sie ein Array für den alleinigen Zweck schaffen es zurückzugeben, dann gibt es keinen Grund, nicht die volle Kontrolle, um es zu geben. Wenn Sie auf der anderen Seite sind eine Sammlung der Rückkehr, das ein Mitglied der Klasse ist, sollten Sie nur so wenig Zugang zu ihm ermöglichen, wie benötigt wird.

Ich kann es auch nicht verstehen. Arrays sind sehr wandelbar, mit Ausnahme ihrer Größe. Einzelne Elemente können noch geändert werden. Vielleicht meinte er Arrays Werttypen sind und Listen sind Referenztypen. Ich weiß es nicht.

Wie auch immer, sollten Sie vielleicht einen Blick auf haben Eric Lippert Meinung zu diesem Thema. Könnten Sie für die Diskussion mit einiger Munition liefern, auch.

Vielleicht ist dies jemand nicht weiß, was er spricht?

Der Grund, eine Schnittstelle als Rückgabetyp über die tatsächliche Art selbst zu verwenden, ist es, die interne Implementierung von dem Anrufer zu verstecken. Diese Konstruktion ermöglicht die Implementierung ohne repurcusions auf den Rest der Anwendung den tatsächlichen Typ zu ändern.

Es macht keinen Sinn, eine intern verwendete Sammlung in ein Array für die externen Gebrauch zu kopieren, aus keinem anderen Grunde als wandelbar oder unveränderlich.

Seperate Fragen sind: - eine Liste der stark typisierte Daten zurückgeben oder nicht. IList oder IList. Die Verwendung von stark typisierte Daten wird immer bevorzugt. - wandelbar oder unveränderlich. ICollection, IList oder IEnumerator Rückkehr mit dem, was Sie auf die Daten ermöglichen möchten. Für eine Nur-Lese-Liste zurück nur eine IEnumerator. Wenn der Anrufer darf die Sammlung Verwendung ICollection oder IList ändern.

Im Grunde er sagt: „Wir Strukturen bevorzugen, die sich nicht leicht zur Laufzeit geändert, weil wir sie glauben, Fehler zu sein, weniger anfällig für.“ Ob das in diesem Fall richtig ist, ist eine andere Frage.

Vielleicht meinte er die Größe des Arrays als „unveränderlich“? Grundsätzlich erklären Sie die Größe einmal und Sie mit ihm stecken sind. Mit Listen können Sie immer auf „Hinzufügen“.

I annehmen , die , wenn du bist sicher über die Größe der Liste, vielleicht Array ist ein bisschen schneller?

Well. IList ist wandelbar in dem Sinne, dass Sie hinzufügen können, und Elemente entfernen, anstatt nur die Elemente ändern, die bereits vorhanden sind. Ein Array können Sie verwirren mit einzelnen Positionen, aber ein bestimmter Index wird nie ganz ungültig. Es gibt eine Reihe von Gründen Unveränderlichkeit zu bevorzugen -. Es macht die Oberfläche für die versehentliche Beschädigung von Daten viel kleiner, zum Beispiel

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top