web-dev-qa-db-ja.com

読み取り専用コレクションとは何ですか?

セキュリティコードアナリストを実行したところ、 CA2105警告 が発生しました。グレード改ざんの例を見ました。 int []を読み取り専用intに割り当てることができることに気づいていませんでした。読み取り専用はC++ constのようなものであり、違法だと思いました。

違反を修正する方法では、オブジェクトのクローンを作成するか(実行したくない)、「配列を変更できない強い型のコレクションに置き換える」ことをお勧めします。リンクをクリックして「ArrayList」を表示し、各要素を1つずつ追加しましたが、何かが追加されるのを防ぐことができないようです。

それで、私がこのコードを持っているとき、それを読み取り専用コレクションにするための最も簡単または最良の方法は何ですか?

public static readonly string[] example = { "a", "b", "sfsdg", "sdgfhf", "erfdgf", "last one"};
21
user34537

変更できないコレクションを作成する最も簡単な方法は、

ReadOnlyCollection

MSDNの例:

List<string> dinosaurs = new List<string>();
dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Compsognathus");

ReadOnlyCollection<string> readOnlyDinosaurs = new ReadOnlyCollection<string>(dinosaurs);
38
Mikael Svenson
public static readonly ReadOnlyCollection<string> example
    = new ReadOnlyCollection<string>(new string[] { "your", "options", "here" });

(ただし、パブリックフィールドではなくgetプロパティとして公開される可能性があります)

11
Marc Gravell

配列を使用している場合は、次を使用できます

return Array.AsReadOnly(example);

配列を読み取り専用コレクションにラップします。

8
Steve Dennis
var readOnly = new ReadOnlyCollection<string>(example);
3
Mark Seemann

同様の解決策を探していましたが、クラス内からコレクションを変更できるようにしたかったので、ここで概説するオプションを選択しました: http://www.csharp-examples.net/readonly-collection /

要するに、彼の例は次のとおりです。

public class MyClass
{
    private List<int> _items = new List<int>();

    public IList<int> Items
    {
        get { return _items.AsReadOnly(); }
    }
}
1
nelsonmichael
ReadOnlyCollection<string> readOnlyCollection = 
            new ReadOnlyCollection<string>(example);
1
Kyle Rozendo