如何在C#中初始化结构

Vin*_*nod 6 c# struct initialization

我有一些代码来初始化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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

为什么抛出这个错误?

Jon*_*eet 23

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

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

Point p1;
p1._x = 1;
p1._y = 2;
int x = p1.X; // This is okay, now the fields have been assigned
Run Code Online (Sandbox Code Playgroud)

请注意,您不必在此处显式调用构造函数...尽管在封装良好的结构中,您几乎总是必须这样做.你能摆脱这种情况的唯一原因是因为你的领域是公开的.伊克.

但是,我强烈建议你不要使用可变结构.如果你真的想要一个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);
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的意思是让它变得一成不变. (7认同)
  • @Roylee:嗯*我*不喜欢可变结构 - 其他人不同意。但它是否应该是一个结构的细节将取决于上下文。 (2认同)

Ode*_*ded 6

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

public static void Main()
{
  Point p1 = new Point();
  p1.X = 1;
  p1.Y = 2;
}
Run Code Online (Sandbox Code Playgroud)

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

//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);
}
Run Code Online (Sandbox Code Playgroud)

这还允许您避免在结构上设置设置器(保持其不可变)。


Øyv*_*hen 5

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

  • 不,你没有。有关示例,请参阅我的答案,该示例将在不使用任何 `new` 的情况下编译和运行。 (2认同)