2016-05-10 20 views
0

ジョシュ・スミスthisチュートリアルでは、フィールドは読み取り専用として定義されます。これが許される方法変更するフィールドで読み取り専用修飾子を使用するのはなぜですか?

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

をし、ポイントは何ですか:

public class CustomerRepository 
    { 

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

以降読み取り専用リスト、_customersを、更新され、 readonlyを使うのは?

答えて

8

List<Customer>変数自体(_customers)はreadonlyです。つまり、完全に別のリストに切り替えることはできません。それを見ている人は常に同じリストが表示されます。しかし、それでもの要素をに変更することはできます。 MSDN(https://msdn.microsoft.com/en-us/library/acdd6hb7.aspx)から

+0

オブジェクトであれば、そのプロパティに新しい値を設定できますか? – Saeid

+0

@Saeidはい - そうしている変数の値を変更していないので、 'readonly'修飾子に違反していません。 –

4

readonlyキーワードを使用すると、フィールドで使用できる修飾子です。フィールド宣言がreadonly修飾子が含まれる場合、宣言によって導入されたフィールドにの割り当ては、同じクラスで宣言の一部として、またはコンストラクタで

を発生する可能性がありますあなたは_customersフィールドに新しい値を割り当てることはできません、それでもそのリスト内の要素は変更されます。

2

_customers.Add(customer);リストを更新しません。この演算子は、リストの内容を更新します。リストを更新する場合は、_customers= ...のようなものを使用する必要があります。 readonly

1

フィールドを読み取り専用にする点は、参照を変更できないことです。それはあなたが方法.Add()メソッドを通じてコレクションにアクセス呼び出す

_customers = null; 

または

_customers = new List<Customer>(); 

のようなものを書くことができず、オブジェクトの参照を変更しないことを意味します。

これは、NullReferenceExceptionを防ぐのに便利です。

関連する問題