2010-10-15 53 views
6

Tengo algo de código para inicializar un struct en C#:Cómo inicializar un struct en 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; 
     } 
    } 
} 

El código anterior da un error del compilador:

error CS0165: Use of unassigned local variable 'p1'

¿Por qué se está lanzando este error?

+1

Esto es en realidad uno de mis mani fi esta en C#. Cualquier variable local debe inicializarse a 'IMO 'predeterminada. – leppie

Respuesta

23

no puede utilizar una propiedad en una estructura hasta que conoce todos los campos se han llenado

Por ejemplo, en su caso esto debe compilar:

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

Observe que no hace tiene que llamar explícitamente a un constructor aquí ... aunque en las estructuras bien encapsuladas casi siempre sería tiene que hacerlo. La única razón por la que puedes salirte con la tuya es porque tus campos son públicos. Ick.

Sin embargo, le recomendaría encarecidamente no para usar una estructura mutable de todos modos. Si realmente quieres una estructura, que sea inmutable y pasar los valores al constructor:

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

Creo que quieres decir que sea inmutable. – Dismissile

+0

@JonSkeet Si quiero que las propiedades 'struct' sean 'mutables', ¿eso significa que no debería usar' struct'? Es decir, ¿qué pasa si quiero establecer nuevos valores para X e Y durante todo el proceso? – Roylee

+1

@Roylee: Bueno * I * no me gustan las estructuras mutables, otros no están de acuerdo. Pero los detalles de si debe o no ser una estructura dependerán del contexto. –

3

Es necesario crear un Point primera y asignarlo a p1:

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

Por cierto, usted puede tener una constructor en su estructura - podría facilitar las cosas:

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

Este también le permite evitar tener setters en una estructura (manteniéndola inmutable). .

4

Tienes que inicializarlo con Point p1 = new Point();

+1

No, no es así. Vea mi respuesta para un ejemplo que compilará y ejecutará sin ningún uso de 'new'. –

+0

Tiene toda la razón. Para una estructura mutable, en realidad no necesita usar nueva, pero las estructuras mutables son malas de todos modos :) –

0

El DECLARACIÓN: "punto p1;" requiere un constructor predeterminado. El constructor predeterminado no se prodigará automáticamente debido al punto público (int x, int y). Debe proporcionar un constructor predeterminado: public Point() {...}

+0

Los constructores por defecto no están permitidos en las estructuras. –