2011-08-29 20 views
13

¿Es una buena práctica utilizar IEnumerable aplicación a nivel de cada vez que no es necesario añadir en realidad o eliminar cosas pero sólo enumerarlas?IEnumerable y Buenas Prácticas (WCF) y

pregunta lateral: ¿Alguna vez tuvo algún problema que regresan IEnumerable<T> de un servicio WCF? ¿Puede causar problemas a las aplicaciones del cliente? Después de todo, creo que se serializará en una matriz.

+1

¿Quizás debería agregar de qué idioma está hablando? Este no es un sitio .net solo, después de todo ... –

+0

Tiene razón. Gracias. – User

+2

Si bien ** no es un duplicado exacto **, igual sugiero que eche un vistazo a esta pregunta: http://stackoverflow.com/questions/1072614/should-i-always-return-ienumerablet-instead-of -ilistt – yas4891

Respuesta

1

No tengo ninguna fuente de buenas prácticas, pero a menudo tiendo a depender de List para mis colecciones y implementa IEnumerable, pero lo paso como una lista y no como un IEnumerable, si necesito que se lea solo prefiero pasar ReadOnlyCollection ..

1

No me gusta devolver o aceptar IList<T> o List<T> porque implican la posibilidad de modificar una colección.

Por lo tanto, prefiero devolver T[] como colección de tamaño fijo. También la matriz se puede asignar fácilmente a cualquier otro marco, plataforma, etc.

Y prefiere aceptar IEnumerable<T> para enfatizar que un método enumerará esa colección.

+3

T [] no es una colección de solo lectura: puede modificar los elementos de una matriz. Por el contrario, IList no implica la capacidad de modificar una colección - p. IList .IsReadOnly es verdadero para ReadOnlyCollection . Si es importante que las personas que llaman no modifiquen la colección devuelta, probablemente sea mejor devolver IList e implementar como ReadOnlyCollection de objetos inmutables. – Joe

+0

@Joe: Tienes razón. No solo de lectura Solo de tamaño fijo. – abatishchev

12

Tiendo solo a devolver IEnumerable<T> cuando quiero indicarle a la persona que llama que la implementación puede usar evaluación diferida. De lo contrario, generalmente devolvería IList<T> o ICollection<T>, e implementaría como ReadOnlyCollection<T> si el resultado fuera de solo lectura.

La evaluación diferida puede ser una consideración importante: si su implementación puede lanzar una excepción, esto no se lanzará hasta que la persona que llama comience a enumerar el resultado. Al devolver IList<T> o ICollection<T>, está garantizando que se lanzará cualquier excepción en el momento en que se llame al método.

En el caso de un método WCF, devolver IEnumerable<T> de un método que utiliza evaluación diferida significa que no se lanzará ninguna excepción hasta que su respuesta se serialice, dándole menos oportunidad de manejarlo en el servidor.

Cuestiones relacionadas