为什么在更改的字段上使用只读修饰符?

时间:2016-05-10 07:56:56

标签: c# modifier

在Josh Smith的this教程中,字段被定义为readonly:

    public class CustomerRepository
    {

    readonly List<Customer> _customers;
    ...
    public CustomerRepository(string customerDataFile)
    {
        _customers = LoadCustomers(customerDataFile);
    }
    ...
    }

以后更新只读列表_customers

    public void AddCustomer(Customer customer)
    {
        if (customer == null)
            throw new ArgumentNullException("customer");

        if (!_customers.Contains(customer))
        {
            _customers.Add(customer);

            if (this.CustomerAdded != null)
                this.CustomerAdded(this, new CustomerAddedEventArgs(customer));
        }
    }

如何允许这样做以及使用readonly有什么意义?

4 个答案:

答案 0 :(得分:8)

SupportMapFragment变量本身(List<Customer>)是_customers - 这意味着您无法将其切换为完全不同的列表,确保所有正在查看它的人始终是看到同一个清单。但是,您仍然可以更改列表中的元素。

答案 1 :(得分:4)

来自MSDN(https://msdn.microsoft.com/en-us/library/acdd6hb7.aspx):

  

readonly关键字是您可以在字段上使用的修饰符。当字段声明包含readonly修饰符时,声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中出现

您无法为_customers字段分配新值,但仍会更改该列表中的元素。

答案 2 :(得分:2)

_customers.Add(customer);不会更新列表。此运算符更新列表的内容。如果要更新列表,则必须使用_customers= ...之类的内容。这可以通过readonly

来防止

答案 3 :(得分:1)

使字段只读的要点是不能更改引用。这意味着你不能写像

这样的东西
_customers = null;

_customers = new List<Customer>();

调用方法.Add()通过方法访问集合,并且不会更改对象的引用。

这可以用于防止任何NullReferenceException。