Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中初始化结构#_C#_Struct_Initialization - Fatal编程技术网

C# 如何在C中初始化结构#

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

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