声明和初始化结构变量
本文关键字:变量 结构 初始化 声明 | 更新日期: 2023-09-27 18:29:33
这将是一个快速的问题。我不太明白为什么会发生这种事,所以我会通过简单的例子告诉你困扰我的是什么。。
第一个例子:
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"
在第一种情况下,它也没有初始化,但它完成了任务,这有什么意义?
附言:无意双关
在第一种情况下,它是一个static
字段,它将由编译器自动初始化。在第二种情况下,它是一个局部变量,您负责初始化它,而不是编译器。
未初始化的类成员不会导致编译器错误,因为它们的范围太广,编译器无法确定是否可以在其他地方初始化。它可以在构造函数中初始化,也可以在任何其他类方法中初始化,甚至可以在外部初始化(如果它是public
)。通过在局部作用域中声明变量,编译器可以很容易地确定变量在使用之前是否已初始化。
结构的"默认"值是一个结构,它的每个字段都设置为其类型的默认值,因此X
和Y
的值为(0,0)
时,您可以有效地获得一个点。
如果您将Point
声明为class
而不是struct
,那么您将在运行时获得NullReferenceException
,因为当您调用pt.Display()
时,引用将具有null值。