A menudo tengo el caso en el que deseo devolver un Enumerable<T>
desde un método o una propiedad. Para compilar el Enumerable<T>
que regresa, utilizo un List<T>
-instance. Después de completar la lista, devuelvo la lista.¿Es un error devolver una lista si el tipo de devolución es enumerable?
Siempre pensé que esto era suficiente. Pero existe la posibilidad de que la persona que llama arroja el resultado Enumerable<T>
de vuelta al List<T>
y comienza a trabajar más con él. Si en un momento posterior cambio la implementación de mi método, el código de la persona que llama fallará. Para evitar esto, podría devolver list.ToArray o hacer una lista de solo lectura antes de devolverla a la persona que llama. Pero para mí esto parece ser una gran exageración. ¿Qué piensas?
Tenga en cuenta que Nunca devolveré una lista de uso interno para que la persona que llama pueda cambiar el estado interno de mis objetos. La pregunta es solo acerca de una lista viva corta que se construye temporalmente para contener los valores devueltos.
IEnumerable<string> GetAList() {
List<string> aList = new List<string>();
aList.Add("a");
aList.Add("b");
return aList;
}
IEnumerable<string> GetAList() {
List<string> aList = new List<string>();
aList.Add("a");
aList.Add("b");
return aList.ToArray<string>();
}
Los ejemplos son super-sencilla y en este caso me gustaría trabajar desde el principio con las matrices, pero es sólo para mostrar a explicar la cuestión.
También podrían usar métodos LINQ como '.Concat (...)' ... realmente no se puede evitar que otros desarrolladores se tomen fotos. –
No creo que sea tan terrible exponer indirectamente el estado interno a través de retornos IEnumerable. El acceso privado es privado por convención; el compilador hace cumplir esto bastante bien, pero una vez que está en un ambiente de plena confianza con Reflection, todas las apuestas están desactivadas. De acuerdo, alguien que use Reflection para acceder a un campo privado debería tener una idea bastante clara del peligro de lo que están haciendo, pero es solo marginalmente peor que lanzar un tipo de devolución que no esté garantizado por el contrato de la clase. Idealmente, ni siquiera pueden averiguar qué tipo está devolviendo sin Reflector o el depurador. –