2014-11-03 13 views
6

ich einige grundlegende Konzepte zu verstehen, ich versuche:Nur-Lese-Ändern des Verhaltens einer Struktur

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

Wenn ich diesen Code ausführen es gibt mir 1, 1, 1, aber wenn ich die entfernen „Read-only“ es sagt 1, 2, 3.

Kann mir jemand das erklären?

Antwort

5

Abschnitt 7.5.4 der C# Spezifikationen heißt es:

[...], wenn das Feld ist nur lesbar und die Referenz erfolgt außerhalb eines Instanzkonstruktor der Klasse, in der das Feld deklariert wird, dann ist die Ergebnis ist ein Wert, nämlich der Wert des Feldes I in dem Objekt von E referenzierten

Also, wenn das Feld readonly Sie eine Kopie ist mutiert (da es unmöglich ist, einen Wert zu mutieren, nur eine Variable). Wenn es nicht ist, mutieren Sie das Feld selbst.

Dies wird ausführlicher in this blog post von Eric Lippert beschrieben. Um seine Endung zu zitieren:

Dies ist ein weiterer Grund, warum veränderbare Werttypen böse sind. Versuchen Sie, Werttypen immer unveränderlich zu machen.

+0

Ist es nur ich, oder das Beispiel von Eric Lippert ist genau wie die OPs? – mihai

+0

@Mihai Es ist * wirklich * nah. Es gibt einige Unterschiede, die für das vorliegende Problem nicht relevant sind. – Servy