我找了一位安全代码分析师,发现自己有一个CA2105 warning。我查看了等级篡改示例。我没有意识到你可以将int []分配给readonly int。我认为readonly就像C ++ const并且使它成为非法。
如何修复违规建议我克隆对象(我不想做)或'用无法更改的强类型集合替换数组'。我点击了链接并看到'ArrayList'并逐个添加每个元素,看起来你不能阻止添加更多元素。
所以当我有这段代码时,最简单或最好的方法是什么才能使它成为只读集合?
public static readonly string[] example = { "a", "b", "sfsdg", "sdgfhf", "erfdgf", "last one"};
答案 0 :(得分:34)
拥有一个无法修改的集合的最简单方法是使用
来自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(); }
}
}