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)
您需要创建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)
这还允许您避免在结构上设置设置器(保持其不可变)。
| 归档时间: |
|
| 查看次数: |
29328 次 |
| 最近记录: |