如何使类的属性不能改变

本文关键字:不能 能改变 属性 何使类 | 更新日期: 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

<标题> 1
private readonly List<int> _l;
public List<int> l { get; set; }
<标题> 2 h1> SDN readonly prop link