2016-05-10 1 views
0

In this Tutorial von Josh Smith, ein Feld als nur lesbar definiert:Warum einen readonly-Modifizierer für ein Feld verwenden, das sich ändert?

public class CustomerRepository 
    { 

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

und später die Nur-Lese-Liste wird _customers, aktualisiert:

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

Wie dies erlaubt ist und was ist der Punkt, Readonly verwenden?

Antwort

8

Die List<Customer> Variable selbst (_customers) ist readonly - das bedeutet, dass Sie sie nicht für eine völlig andere Liste ausschalten können, um sicherzustellen, dass jeder, der es betrachtet, immer dieselbe Liste sehen wird. Sie können jedoch immer noch die Elemente innerhalb dieser Liste ändern.

+0

Was wäre, wenn es ein Objekt wäre, wäre ich in der Lage, neue Werte für seine Eigenschaften zu setzen? – Saeid

+0

@Said Ja - Sie ändern nicht den Wert der Variablen, die das tut, also verletzen Sie nicht den Modifizierer 'readonly'. –

4

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

Das readonly Schlüsselwort ist ein Modifikator, die Sie auf Felder verwenden können. Wenn eine Felddeklaration einen readonly Modifikator enthält, Zuweisungen zu den Feldern durch die Deklaration eingeführt wird, können nur als Teil der Deklaration oder in einem Konstruktor in der gleichen Klasse auftreten

Sie können keinen neuen Wert zu _customers Feld zuweisen, aber Sie ändern immer noch die Elemente in dieser Liste.

2

_customers.Add(customer); aktualisiert die Liste nicht. Dieser Operator aktualisiert den Inhalt der Liste. Wenn Sie die Liste aktualisieren möchten, müssen Sie etwas wie _customers= ... verwenden. Und dies wird verhindert durch die readonly

1

Der Punkt, das Feld schreibgeschützt zu machen, ist, dass die Referenz nicht geändert werden kann. Das bedeutet, dass Sie nicht so etwas wie

_customers = null; 

oder

_customers = new List<Customer>(); 

Aufrufen der Methode .Add() greift auf die Sammlung durch ein Verfahren schreiben, und nicht den Bezug des Objekts ändern.

Dies könnte nützlich sein, um eine NullReferenceException zu verhindern.

Verwandte Themen