Modernere Lösung
Sofern die interne Sammlung nicht veränderbar sein muss, können Sie das System.Collections.Immutable
Paket verwenden, Ihren Feldtyp in eine unveränderliche Sammlung ändern und diese dann direkt verfügbar machen - vorausgesetzt Foo
natürlich, sie ist unveränderlich.
Die Antwort wurde aktualisiert, um die Frage direkter zu beantworten
Gibt es einen Grund, eine interne Sammlung als ReadOnlyCollection und nicht als IEnumerable verfügbar zu machen, wenn der aufrufende Code nur die Sammlung durchläuft?
Es hängt davon ab, wie sehr Sie dem aufrufenden Code vertrauen. Wenn Sie die vollständige Kontrolle über alles haben, was dieses Mitglied jemals anrufen wird, und Sie garantieren, dass kein Code jemals verwendet wird:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
Dann wird sicher kein Schaden angerichtet, wenn Sie die Sammlung direkt zurückgeben. Ich versuche im Allgemeinen, ein bisschen paranoider zu sein.
Ebenso, wie Sie sagen: Wenn Sie nur brauchen IEnumerable<T>
, warum binden Sie sich dann an etwas Stärkeres?
Ursprüngliche Antwort
Wenn Sie .NET 3.5 verwenden, können Sie das Erstellen einer Kopie und die einfache Umwandlung vermeiden, indem Sie einen einfachen Aufruf von Überspringen verwenden:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Es gibt viele andere Optionen für das einfache Umbrechen - das Schöne an Skip
Select / Where ist, dass es keinen Delegaten gibt, der für jede Iteration sinnlos ausgeführt werden kann.)
Wenn Sie .NET 3.5 nicht verwenden, können Sie einen sehr einfachen Wrapper schreiben, um dasselbe zu tun:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
umschließen, wenn Sie paranoid sind, aber jetzt sind Sie nicht an eine bestimmte Implementierung gebunden.