声明和初始化结构变量

本文关键字:变量 结构 初始化 声明 | 更新日期: 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)。通过在局部作用域中声明变量,编译器可以很容易地确定变量在使用之前是否已初始化。

结构的"默认"值是一个结构,它的每个字段都设置为其类型的默认值,因此XY的值为(0,0)时,您可以有效地获得一个点。

如果您将Point声明为class而不是struct,那么您将在运行时获得NullReferenceException,因为当您调用pt.Display()时,引用将具有null值。