Question

Disons que nous avons une classe générique avec une liste privée.Nous pouvons lui faire renvoyer un wrapper en lecture seule de cette liste au moins de deux manières :

public class Test<T>
{
    public List<T> list = new List<T>();

    public IEnumerable<T> Values1
    {
        get
        {
            foreach (T i in list)
                yield return i;
        }
    }

    public IEnumerable<T> Values2
    {
        get
        {
            return list.AsReadOnly();
        }
    }
}

Les deux Values1 et Values2 refléter tout changement dans la collection sous-jacente et l’empêcher de se modifier par lui-même.

Quelle voie si préférable ?De quoi faut-il être conscient ?Ou existe-t-il un autre meilleur moyen ?

Était-ce utile?

La solution

Si seulement un IEnumerable<T> est requis pour la sortie, je préfère :

public IEnumerable<T> Values
{
    return this.list.AsReadOnly();
}

Depuis ReadOnlyCollection<T> met en oeuvre IEnumerable<T>, cela fournit un emballage sûr autour de vos objets, tout en restant flexible et efficace, et en empêchant un casting de pouvoir définir des valeurs.

Vous pouvez toujours modifier l'implémentation interne ultérieurement si vous décidez que vous devez faire quelque chose de différent dans les résultats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top