2010-10-03 14 views
9

Hay una Lookup<,> método en el que no está en ILookup<,>:¿Por qué Enumerable.ToLookup <>() devuelve un ILookup <,> y no una búsqueda <,>?

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector); 

¿Por qué es el tipo de retorno de Enumerable.ToLookup<>() declarado ILookup<,> a pesar del hecho de que siempre parece volver una instancia de Lookup<,>? Si, en cambio, se declarase que el tipo de devolución es Lookup<,>, el método anterior podría usarse sin un molde.

Respuesta

15

Las mejores prácticas para diseñar API públicas dictan que devolver una interfaz es una mejor idea que devolver una clase concreta, porque puede devolver una clase concreta diferente si es necesario. No se supone que el consumidor de la API dependa de que la instancia devuelta sea de un tipo específico.

Como señala, ToList y ToDictionary devuelven tipos concretos en lugar de interfaces. Quizás la razón para esto es que ToList y ToDictionary tenían la intención de devolverle una copia que puede modificar si lo desea. Dado que las interfaces IList y IDictionary no le garantizan que sean editables (lo que posiblemente sea una mala idea), los diseñadores decidieron devolver el tipo concreto.

Imagine un método hipotético ToIList(). Si se llama a una matriz, podría implementarse para devolverle una copia de la matriz, porque las matrices implementan IList<T>. Puede que se sorprenda al descubrir que llama al Add().

Por otro lado, ILookup es una interfaz de solo lectura, por lo que lo anterior no se aplica. Por lo tanto, no hay ningún motivo que no sea para seguir las mejores prácticas, como ocurre con ToList.

+4

Bueno, seguramente 'ToList' y' ToDictionary' están realmente mal diseñados. – Timwi

+0

@Timwi Dirigido eso en una edición. –

Cuestiones relacionadas