26

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

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

では、このコードを取得した場合、それを読み取り専用のコレクションにする最も簡単または最良の方法は何ですか?

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

6 に答える 6

42

変更できないコレクションを持つ最も簡単な方法は、使用することです

読み取り専用コレクション

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);
于 2010-04-21T06:48:38.243 に答える
13
public static readonly ReadOnlyCollection<string> example
    = new ReadOnlyCollection<string>(new string[] { "your", "options", "here" });

(ただし、おそらくgetpublic フィールドではなくプロパティとして公開する必要があります)

于 2010-04-21T06:46:14.503 に答える
12

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

return Array.AsReadOnly(example);

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

于 2010-04-21T13:35:13.943 に答える
3
var readOnly = new ReadOnlyCollection<string>(example);
于 2010-04-21T06:46:08.257 に答える
1

同様のソリューションを探していましたが、クラス内からコレクションを変更できるようにしたかったため、ここで概説されているオプションを選択しました: 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(); }
    }
}
于 2013-02-21T00:48:09.780 に答える
1
ReadOnlyCollection<string> readOnlyCollection = 
            new ReadOnlyCollection<string>(example);
于 2010-04-21T06:47:10.950 に答える