什么是只读集合?

时间:2010-04-21 06:43:43

标签: c# wcf readonly readonly-collection

我找了一位安全代码分析师,发现自己有一个CA2105 warning。我查看了等级篡改示例。我没有意识到你可以将int []分配给readonly int。我认为readonly就像C ++ const并且使它成为非法。

如何修复违规建议我克隆对象(我不想做)或'用无法更改的强类型集合替换数组'。我点击了链接并看到'ArrayList'并逐个添加每个元素,看起来你不能阻止添加更多元素。

所以当我有这段代码时,最简单或最好的方法是什么才能使它成为只读集合?

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

6 个答案:

答案 0 :(得分:34)

拥有一个无法修改的集合的最简单方法是使用

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

答案 1 :(得分:10)

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

(尽管它应该仍然可以作为get属性而不是公共字段公开)

答案 2 :(得分:8)

如果您正在使用数组,则可以使用

return Array.AsReadOnly(example);

将数组包装在只读集合中。

答案 3 :(得分:3)

var readOnly = new ReadOnlyCollection<string>(example);

答案 4 :(得分:1)

ReadOnlyCollection<string> readOnlyCollection = 
            new ReadOnlyCollection<string>(example);

答案 5 :(得分: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(); }
    }
}