如何在C#中初始化结构

我有一些代码来初始化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; } } } 

上面的代码给出了编译器错误:

错误CS0165:使用未分配的局部变量’p1′

为什么抛出这个错误?

在知道所有字段都已填入之前,您不能在结构中使用属性

例如,在您的情况下,这应该编译:

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

注意你不必在这里显式调用构造函数……虽然在封装良好的结构中你几乎总是必须这样做。 你可以逃脱的唯一原因是因为你的领域是公开的。 伊克。

但是,我强烈建议你不要使用可变结构。 如果你真的想要一个struct,那就让它成为不可变的并将值传递给构造函数:

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

你必须用Point p1 = new Point();初始化它Point p1 = new Point();

您需要先创建一个Point并将其分配给p1

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

顺便说一句,你可以在你的结构上有一个构造函数 – 可以使事情变得更容易:

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

这也允许您避免在结构上设置setter (使其保持不变)。

声明:“点p1;” 需要一个默认的构造函数。 由于公共Point(int x,int y),将不会自动生成默认构造函数。 您需要提供默认构造函数:public Point(){…}