26

我运行了一个安全代码分析师,我发现自己有一个CA2105 警告。我查看了年级篡改示例。我没有意识到您可以将 int[] 分配给只读 int。我认为 readonly 就像 C++ const 并使其非法。

How to Fix Violations 建议我克隆对象(我不想这样做)或“用无法更改的强类型集合替换数组”。我单击链接并查看“ArrayList”并一一添加每个元素,看起来您无法阻止添加更多内容。

那么当我有这段代码时,让它成为只读集合的​​最简单或最好的方法是什么?

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

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

于 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
ReadOnlyCollection<string> readOnlyCollection = 
            new ReadOnlyCollection<string>(example);
于 2010-04-21T06:47:10.950 回答
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 回答