C# 如何在C中初始化结构#
我有一些代码来初始化C#中的结构: 上面的代码给出了一个编译器错误: 错误CS0165:使用未分配的本地 变量“p1”C# 如何在C中初始化结构#,c#,struct,initialization,C#,Struct,Initialization,我有一些代码来初始化C#中的结构: 上面的代码给出了一个编译器错误: 错误CS0165:使用未分配的本地 变量“p1” 为什么会抛出此错误?您需要首先创建一个点,并将其分配给p1: public static void Main() { Point p1 = new Point(); p1.X = 1; p1.Y = 2; } 顺便说一句,你可以在你的结构上有一个,这可以让事情变得更简单: //in Point.cs public point (int x, int y) {
为什么会抛出此错误?您需要首先创建一个
点
,并将其分配给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(使其保持不变)。在结构中的属性知道所有字段都已填充之前,不能使用该属性
例如,在您的情况下,应编译:
Point p1;
p1._x = 1;
p1._y = 2;
int x = p1.X; // This is okay, now the fields have been assigned
请注意,您不必在此处显式调用构造函数。。。尽管在封装良好的结构中,您几乎总是必须这样做。你能逃脱惩罚的唯一原因是你的字段是公共的。哎呀
但是,我强烈建议您无论如何不要使用可变结构。如果确实需要结构,请使其不可变并将值传递给构造函数:
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);
您必须使用
点p1=新点()对其进行初始化代码>语句:“点p1;”需要默认构造函数。
默认构造函数将不会自动生成,因为
公共点(整数x,整数y)。
您需要提供默认构造函数:
public Point(){…}我想你的意思是让它不可变。@JonSkeet如果我想让struct
属性是“可变的”,这是否意味着我不应该使用struct
?也就是说,如果我想在整个过程中为X和Y设置新的值呢?@Roylee:我不喜欢可变结构,其他人不同意。但是它是否应该是一个结构的细节将取决于上下文。请参阅我的答案以获取一个示例,该示例将在不使用任何new
的情况下编译和运行。您完全正确。对于可变结构,实际上不需要使用new,但可变结构是邪恶的:)这实际上是我在C#中最讨厌的一个。任何局部变量都应初始化为default
IMO。结构上不允许使用默认构造函数。
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);