2014-11-03 9 views
6

Sto cercando di capire alcuni concetti di base:sola lettura cambiare il comportamento di una struttura

class Program 
{ 
    private static readonly MyStruct m = new MyStruct(); 
    static void Main(string[] args) 
    { 
     //new MutableSample().RunSample(); 

     Console.WriteLine(m.ChangeInternal()); 
     Console.WriteLine(m.ChangeInternal()); 
     Console.WriteLine(m.ChangeInternal()); 
     Console.Read(); 
    } 
} 

public struct MyStruct 
{ 
    private int x; 
    public int ChangeInternal() 
    { 
     this.x = this.x + 1; 
     return this.x; 
    } 
} 

Quando ho eseguito questo codice mi dà 1, 1, 1, ma quando ho rimuovere il "sola lettura" si dice 1, 2, 3.

Qualcuno può spiegarmi questo?

risposta

5

sezione 7.5.4 delle specifiche C# afferma:

[...] se il campo è in sola lettura e il riferimento avviene al di fuori un'istanza costruttore della classe in cui il campo è dichiarato, allora la risultato è un valore, vale a dire il valore del campo I nell'oggetto a cui fa riferimento E

Così, quando il campo è readonly si sta mutando una copia (dal momento che è impossibile mutare un valore, solo una variabile). Quando non lo sei muti il ​​campo stesso.

Questo è descritto in modo più dettagliato in this blog post da Eric Lippert. Per citare la sua fine:

Questo è un altro motivo per cui i tipi di valori mutabili sono malvagi. Cerca di rendere sempre immutabili i tipi di valore.

+0

Sono solo io, o l'esempio dato da Eric Lippert è esattamente come gli OP? – mihai

+0

@Mihai È * davvero * vicino. Ci sono alcune differenze che non sono pertinenti al problema in questione. – Servy

Problemi correlati