如何使类的属性不能改变
本文关键字:不能 能改变 属性 何使类 | 更新日期: 2023-09-27 18:01:24
假设我们有如下的简单类:
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);
我们有on console
11
22
因此,foo类中的列表被改变。是否有可能在c#中再次看到控制台
1
2
首先:这是c#,您无法保护您的代码免受恶意滥用。但是,您可以通过使其难以被误用来使其用户友好。例如,通过使用满足所有标准的接口…而不是更多:
public class Foo
{
public IEnumerable<int> Numbers { get; private set; }
public Foo(IEnumerable<int> numbers)
{
this.Numbers = numbers;
}
}
您可以复制输入列表,将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());
}
}
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);
}
}
你可以用一个只读属性来修饰你的私有变量,或者在你的属性中不包含"set"动作。
你真正需要的是这个选项#1或#2
<标题> 1private readonly List<int> _l;
public List<int> l { get; set; }
<标题> 2 h1> SDN readonly prop link
标题>标题>