Solución más moderna
A menos que necesite que la colección interna sea mutable, puede usar el System.Collections.Immutable
paquete, cambiar su tipo de campo para que sea una colección inmutable y luego exponerlo directamente, suponiendo que Foo
sea inmutable, por supuesto.
Respuesta actualizada para abordar la pregunta más directamente
¿Hay alguna razón para exponer una colección interna como ReadOnlyCollection en lugar de IEnumerable si el código de llamada solo itera sobre la colección?
Depende de cuánto confíes en el código de llamada. Si tiene el control total sobre todo lo que alguna vez llamará a este miembro y garantiza que ningún código usará:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
entonces seguro, no se hará daño si solo devuelve la colección directamente. Sin embargo, generalmente trato de ser un poco más paranoico que eso.
Del mismo modo, como dices: si solo necesitas IEnumerable<T>
, ¿por qué atarte a algo más fuerte?
Respuesta original
Si está utilizando .NET 3.5, puede evitar hacer una copia y evitar la conversión simple mediante una simple llamada para Omitir:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Hay muchas otras opciones para ajustar trivialmente; lo bueno de Skip
seleccionar / Dónde es que no hay delegado para ejecutar sin sentido para cada iteración).
Si no está utilizando .NET 3.5, puede escribir un contenedor muy simple para hacer lo mismo:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
si eres paranoico, pero ahora no estás atado a una implementación específica.