8
string[] _myStrings = { "Hello", "There", "Happy", "Day" };

public IEnumerable<string> MyStrings1
{
    get
    {
        return new System.Collections.ObjectModel.ReadOnlyCollection<string>(_myStrings);
    }
}

public IEnumerable<string> MyStrings2
{
    get
    {
        return from s in _myStrings select s;
    }
}

パブリック プロパティに配列を使用しないという議論を見てきました。私はMyStrings2コンベンションを利用しています。MyStrings1代わりに使用する必要がある理由はありますか?

4

2 に答える 2

14

要するに、あなたの質問は、メンバーコレクションを公開するための ReadOnlyCollection または IEnumerable のJon Skeet による完全に適切な回答でカバーされていると思います。

さらに: エミュレートすることができますAsReadOnly():

public ReadOnlyCollection<Abc> List
{
    get { return new ReadOnlyCollection(list); }
}

更新:
これは のコピーを作成しませんlistReadOnlyCollectionデータをコピーせず、提供されたリストで直接動作します。ドキュメントを参照してください:

読み取り専用のコレクションは、コレクションの変更を防止するラッパーを持つコレクションです。したがって、基になるコレクションに変更が加えられると、読み取り専用コレクションにそれらの変更が反映されます。

このコンストラクターは O(1) 操作です。

于 2012-12-31T18:00:31.890 に答える
1

配列を使用者に直接公開することは、配列を変更できることを意味します。これは、カプセル化とデータ隠蔽の違反です。

これは、他のクラスがその内部を無意味に変更できるかどうかを保証できないため、クラスにいくつかの不変条件 (動作と保持するデータの保証) がある場合に問題になる可能性があります。

マルチスレッド環境では、あるスレッドがデータを読み取ろうとしている間に別のスレッドがデータを変更する可能性があるため、これはさらに問題になります。異なるスレッドで一貫性のないデータを簡単に取得できます。

于 2012-12-31T17:59:13.837 に答える