Comment initialiser une structure en C #

J’ai du code pour initialiser une structure 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; } } } 

Le code ci-dessus donne une erreur de compilation:

erreur CS0165: Utilisation de la variable locale non affectée ‘p1’

Pourquoi cette erreur est-elle lancée?

Vous ne pouvez pas utiliser une propriété dans une structure tant qu’elle ne saura pas que tous les champs ont été renseignés.

Par exemple, dans votre cas, cela devrait comstackr:

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

Remarquez qu’il n’est pas nécessaire d’appeler explicitement un constructeur ici … bien que dans les structures bien encapsulées, vous devriez presque toujours. La seule raison pour laquelle vous pouvez vous en tirer est que vos champs sont publics. Ick.

Cependant, je vous conseillerais fortement de ne pas utiliser une structure mutable de toute façon. Si vous voulez vraiment une structure, rendez-la immuable et transmettez les valeurs au constructeur:

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

Vous devez l’initialiser avec Point p1 = new Point();

Vous devez d’abord créer un Point et l’assigner à p1 :

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

À propos, vous pouvez avoir un constructeur sur votre structure – cela pourrait faciliter les choses:

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

Cela vous permet également d’éviter d’avoir des setters sur une structure (en la gardant immuable).

La déclaration: “Point p1;” nécessite un constructeur par défaut. Le constructeur par défaut ne sera pas automatiquement produit à cause du point public (int x, int y). Vous devez fournir un constructeur par défaut: public Point () {…}