这将是一个快速的问题。我不太明白为什么会这样,所以我会通过简单的例子告诉你什么在困扰我。
第一个例子:
private static Point pt;
public static void Main(string[] args)
{
pt.Display();
}
public struct Point
{
public int X;
public int Y;
public void Display()
{
Console.WriteLine("X = {0}, Y = {1}", X, Y);
}
}
第二个例子:
public static void Main(string[] args)
{
Point pt;
pt.Display();
}
public struct Point
{
public int X;
public int Y;
public void Display()
{
Console.WriteLine("X = {0}, Y = {1}", X, Y);
}
}
我可能会遗漏一些明显的东西,但是第一个示例编译正确,我在控制台上输出,而在第二个示例中它甚至不会编译,因为:
在访问之前,可能无法初始化局部变量“pt”。
嗯,它也没有在第一种情况下初始化,但是它完成了这项工作,重点是什么?
P.S。没有双关语。
答案 0 :(得分:3)
在第一种情况下,它是一个static
字段,它将由编译器自动初始化。在第二种情况下,它是一个局部变量,你负责初始化它,而不是编译器。
答案 1 :(得分:2)
未初始化的类成员不会导致编译器错误,因为它们的范围太宽,编译器无法确定是否可以在其他位置初始化它。它可以在构造函数中,在任何其他类方法中初始化,如果是public
,甚至可以在外部初始化。使用在本地范围内声明的变量,编译器可以在使用之前轻松确定变量是否已初始化。
结构的“默认”值是一个结构体,其每个字段都设置为其类型的默认值,因此您可以有效地获得X
和Y
值为{{{1}的点。 1}}。
如果您已将(0,0)
声明为Point
而不是class
,那么您在运行时已获得struct
,因为当您使用时,引用将具有空值致电NullReferenceException
。