假设我们有如下简单的类:
public class Foo
{
public List<int> l { get; set; }
public Foo(List<int> newList)
{
this.l = newList;
}
}
现在我们可以使用它了:
List<int> l = new List<int>() { 1, 2 };
Foo foo = new Foo(l);
foreach (int i in foo.l)
Console.WriteLine(i);
当然,在控制台上我们看到了
1
2
但是如果我们更改列表l
:
l[0] = 11;
l[1] = 22;
再次调用循环:
foreach (int i in foo.l)
Console.WriteLine(i);
我们在控制台上
11
22
因此,改变了foo类中的列表。在C#中有没有可能再次在控制台上看到
1
2
所以make class Foo这样,列表永远不会改变?
答案 0 :(得分:3)
您可以复制输入列表,将setter设为私有,并公开IReadOnlyList<T>
:
public class Foo
{
public IReadOnlyList<int> l { get; private set; }
public Foo(IEnumerable<int> newList)
{
this.l = new ReadOnlyCollection<int>(newList.ToList());
}
}
答案 1 :(得分:3)
首先要做的事情是:这是C#,您无法保护您的代码免受恶意滥用。但是,您可以通过使其难以滥用来使其用户友好。例如,通过使用满足所有条件的接口......而不是更多:
public class Foo
{
public IEnumerable<int> Numbers { get; private set; }
public Foo(IEnumerable<int> numbers)
{
this.Numbers = numbers;
}
}
答案 2 :(得分:0)
public class Foo
{
private List<int> _l;
public IList<int> L { get { return this._l.AsReadOnly(); } }
public Foo(List<int> newList)
{
this._l = new List<int>(newList);
}
}
答案 3 :(得分:0)
您可以使用只读属性修饰私有变量,或者不包括&#34; set&#34;对你的财产采取行动。
您实际需要的是此选项#1或#2
private readonly List<int> _l;
public List<int> l { get; set; }
public List<int> l { get; }