10

たとえば、プライベートリストを持つジェネリッククラスがあります。少なくとも2つの方法で、このリストの読み取り専用ラッパーを返すようにすることができます。

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();
        }
    }
}

両方とも、基になるコレクションの変更Values1Values2反映し、それ自体が変更されるのを防ぎます。

どちらが望ましいですか?何に注意する必要がありますか?それとも他にもっと良い方法はありますか?

4

1 に答える 1

12

IEnumerable<T>出力に必要なのが1つだけの場合は、次のようにします。

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

ReadOnlyCollection<T>を実装しているのでIEnumerable<T>、これはオブジェクトの周りに安全なラッパーを提供しますが、それでも柔軟性と効率性があり、キャストが値を設定できないようにします。

結果で何か別のことをする必要があると判断した場合は、後でいつでも内部実装を変更できます。

于 2012-10-02T01:30:25.900 に答える