2010-04-26 1 views
4

Ici je le bit de code suivant:De retour d'un ReadOnlyCollection d'une méthode avec un type de retour IList

private IList<IState> _states = new List<IState>(); 
    private ReadOnlyCollection<IState> _statesViewer; 

    public IList<IState> States { get { return _statesViewer; } } 

Je crois que généralement il est préférable de retourner les interfaces plutôt que les classes concrètes elles-mêmes, mais dans ce cas, ne devrais-je pas définir comme le type de retour de la propriété States un ?

Tout utilisateur de ma bibliothèque pensera qu'il est possible de faire tout ce que vous pouvez faire avec un IList si je le définis comme tel, et cela signifie ajouter des éléments. Ce n'est pas vrai et je romprai définitivement le contrat en l'exposant comme IList.

Ai-je raison avec cette vue ou y a-t-il autre chose qui me manque ici?

Répondre

6

Faites tout ce qui rend l'API plus claire. Si l'appelant a seulement besoin de l'énumérer, vous pouvez l'exposer comme IEnumerable<T>, mais je ne serais pas préoccupé de l'exposer comme ReadOnlyCollection. Vous pouvez déclarer un type personnalisé (interface ou classe) avec juste un indexeur et recenseur, bien sûr

3

Si c'était moi, je voudrais simplement exposer comme

IEnumerable<IState> 
2

IEnumerable<T> est un bon choix à tout public propriété qui représente une séquence.

C'est le plus petit contrat possible qui soit encore une séquence, ce qui vous aide à rester découplé.

Il permet une riche collection d'opérations dans Linq pour les objets, de sorte que vous offrez beaucoup de puissance au consommateur.

2

Dans certains cas, je prends le IEnumerable<IState> si les gens ne sont autorisés à parcourir la liste. Mais si j'ai besoin de plus de fonctionnalités intégrées pour le monde extérieur comme l'opérateur d'index, Count, Contient, IndexOf, etc. Je leur donnerai un ReadOnlyCollection comme IList et écrirai dans la documentation qu'il est en lecture seule.

Questions connexes