声明并初始化结构变量

时间:2014-11-06 22:05:46

标签: c# structure

这将是一个快速的问题。我不太明白为什么会这样,所以我会通过简单的例子告诉你什么在困扰我。

第一个例子:

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。没有双关语。

2 个答案:

答案 0 :(得分:3)

在第一种情况下,它是一个static字段,它将由编译器自动初始化。在第二种情况下,它是一个局部变量,你负责初始化它,而不是编译器。

答案 1 :(得分:2)

未初始化的类成员不会导致编译器错误,因为它们的范围太宽,编译器无法确定是否可以在其他位置初始化它。它可以在构造函数中,在任何其他类方法中初始化,如果是public,甚至可以在外部初始化。使用在本地范围内声明的变量,编译器可以在使用之前轻松确定变量是否已初始化。

结构的“默认”值是一个结构体,其每个字段都设置为其类型的默认值,因此您可以有效地获得XY值为{{{1}的点。 1}}。

如果您已将(0,0)声明为Point而不是class,那么您在运行时已获得struct,因为当您使用时,引用将具有空值致电NullReferenceException