2010-10-15 12 views
6

Ich habe einige Codes initialisieren, eine Struktur in C# zu initialisieren:Wie eine Struktur in C#

namespace Practice 
{ 
    public struct Point 
    { 
     public int _x; 
     public int _y; 

     public int X 
     { 
      get { return _x; } 
      set { _x = value; } 
     } 

     public int Y 
     { 
      get { return _y; } 
      set { _y = value; } 
     } 

     public Point(int x, int y) 
     { 
      _x = x; 
      _y = y; 
     }  
    }  

    class Practice 
    { 
     public static void Main() 
     { 
      Point p1; 
      p1.X = 1; 
      p1.Y = 2; 
     } 
    } 
} 

Der obige Code gibt einen Compiler-Fehler:

error CS0165: Use of unassigned local variable 'p1'

Warum diese Fehler geworfen wird?

+1

Dies ist eigentlich einer meiner Lieblings-Peeves in C#. Jede lokale Variable sollte auf "default" IMO initialisiert werden. – leppie

Antwort

23

Sie können keine Eigenschaft in einer Struktur verwenden, bis es all Felder kennen ausgefüllt wurden

Zum Beispiel soll dies in Ihrem Fall kompiliert:

Point p1; 
p1._x = 1; 
p1._y = 2; 
int x = p1.X; // This is okay, now the fields have been assigned 

Beachten Sie, wie Sie nicht explizit einen Konstruktor hier aufrufen müssen ... obwohl in gut eingekapselten Strukturen Sie fast immer haben müssen. Der einzige Grund, warum Sie damit durchkommen können, ist, weil Ihre Felder öffentlich sind. Ick.

Allerdings würde ich Ihnen dringend empfehlen, nicht eine veränderbare Struktur trotzdem zu verwenden. Wenn Sie wirklich eine Struktur wollen, machen es unveränderlich und die Werte in den Konstruktor übergeben:

public struct Point 
{ 
    private readonly int x; 
    public int X { get { return x; } } 

    private readonly int y; 
    public int Y { get { return y; } } 

    public Point(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

... 

Point p1 = new Point(1, 2); 
+7

Ich denke du meinst es unwandelbar machen. – Dismissile

+0

@JonSkeet Wenn ich möchte, dass die "struct" -Eigenschaften "veränderbar" sind, bedeutet das, dass ich "struct" nicht verwenden soll? Also, was, wenn ich während des gesamten Prozesses neue Werte für X und Y setzen möchte? – Roylee

+1

@Roylee: Nun, ich mag keine veränderlichen Strukturen - andere sind anderer Meinung. Aber die Details, ob es eine Struktur sein soll oder nicht, hängen vom Kontext ab. –

3

Sie benötigen einen Point ersten und weisen es p1 zu erstellen:

public static void Main() 
{ 
    Point p1 = new Point(); 
    p1.X = 1; 
    p1.Y = 2; 
} 

By the way, Sie constructor auf Struktur haben kann - könnte die Dinge einfacher machen:

//in Point.cs 
public point (int x, int y) 
{ 
    _x = x; 
    _y = y; 
} 

//in program.cs 
public static void Main() 
{ 
    Point p1 = new Point(1, 2); 
} 

Diese Sie können auch vermeiden, Setter auf einer Struktur (damit es unveränderlich). .

4

Sie haben es zu initialisieren mit Point p1 = new Point();

+1

Nein, tust du nicht. Siehe meine Antwort für ein Beispiel, das kompiliert und ohne Verwendung von "neu" ausgeführt wird. –

+0

Sie haben absolut Recht. Für eine veränderbare Struktur müssen Sie eigentlich keine neuen verwenden, aber veränderbare Strukturen sind sowieso böse. –

0

Die statment: „Punkt p1;“ benötigt einen Standardkonstruktor. Der Standardkonstruktor wird aufgrund des öffentlichen Punkts (int x, int y) nicht automatisch hergestellt. Sie müssen einen Standardkonstruktor zur Verfügung stellen: public Point() {...}

+0

Standardkonstruktoren sind in Strukturen nicht erlaubt. –