如何使类无法更改属性

时间:2014-05-02 11:39:18

标签: c#

假设我们有如下简单的类:

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这样,列表永远不会改变?

4 个答案:

答案 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

1

private readonly List<int> _l;
public List<int> l { get; set; }

2

public List<int> l { get; }

MSDN readonly prop link