为什么在更改的字段上使用只读修饰符?
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。
在 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 areadonly
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。