2014-11-06 288 views
0

这将是一个快速的问题。我不太明白为什么会这样,所以我会告诉你什么是困扰我通过简单的例子..声明和初始化结构变量

第一个例子:

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

回答

3

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

+0

哦,静态关键字指示编译器将变量初始化为默认值? – msmolcic 2014-11-06 22:08:25

+0

@Smola不,它与静态无关。对于所有的班级领域来说都是如此。如果你有一个引用类型字段并且不初始化它,你将不会得到一个未初始化的错误,但是如果你试图访问它的成员,你将在运行时得到一个NullReferenceException,因为null是引用类型的默认值。 – 2014-11-06 22:08:51

+0

那么,如果我得到它的权利包含主要方法的新类已经自动创建,当我运行我的程序?就像我写MyClass class = new MyClass();它会自动初始化我的Point结构,并将其变量设置为默认值,但在第二个示例中,情况并非如此,因为Point不是我启动类的私有成员,而是我的主方法中的局部变量? – msmolcic 2014-11-06 22:14:41

2

未初始化的类成员不会导致该编译器错误,因为它们的作用域太宽,不能确定编译器是否可以在其他地方初始化。它可以在构造函数,任何其他类方法中初始化,或者在外部如果它是public。通过在本地范围内声明的变量,编译器可以轻松确定变量是否在使用前被初始化。

一个结构的“默认”值与它的每个字段设置为它的类型的默认值的结构,让你有效地得到一分与(0,0)XY值。

如果你已经宣布Pointclass,而不是一个struct你会在运行时已经获得了NullReferenceException因为当你调用pt.Display()参考将有一个空值。