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

Why use a readonly modifier on a field that changes?

在 Josh Smith 的 this 教程中,一个字段被定义为只读:

    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));
        }
    }

这是如何允许的,使用只读的意义何在?

List<Customer> 变量本身 (_customers) 是 readonly - 这意味着您不能将其切换为完全不同的列表,以确保正在查看它的每个人都会总是看到相同的列表。但是,您仍然可以更改该列表中的元素。

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

The readonly keyword is a modifier that you can use on fields. When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class

您不能为 _customers 字段分配新值,但您仍然可以更改该列表中的元素。

_customers.Add(customer); 不更新列表。此运算符更新列表的内容。如果你想更新列表,你必须使用像 _customers= ... 这样的东西。 readonly

阻止了这种情况

将字段设置为只读的意义在于无法更改引用。这意味着你不能写类似

的东西
_customers = null;

_customers = new List<Customer>();

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

这可能有助于防止任何 NullReferenceException。