2011-01-06 62 views
1

只是好奇,从下面的代码中我可以看到,类型A的静态字段默认为空,而该类型的变量需要初始化为至少空值。任何人都可以解释一下这个区别吗?谢谢为什么静态字段默认为空?

class Program 
{ 
    static A _a; //it is null by default 
    static void Main(string[] args) 
     { 
      A nonStaticA; //empty reference, exception when used 
      A correctA=null; 
     } 
} 
class A 
{ 
} 
+2

它不仅仅是静态字段,它是所有的字段(类级变量),它们被初始化为默认值(null用于引用,0用于数字,false用于布尔等)。 – 2011-01-06 09:27:43

回答

1

区别在于局部变量字段,不在静态和实例之间。

任何类型的局部变量在被首先使用之前都需要被初始化为一个值。这可以防止您忘记初始化变量的错误。

字段是不同的问题,因为它可能无法在声明时初始化所有字段。例如,初始值可能取决于构造函数参数。因此,字段不需要显式初始化,如果不是,则获取该类型的默认值,即所有引用类型为null

2

它与static无关。类字段(实例和静态)被初始化为默认值,而局部变量则不是。

为什么?像许多事情一样,这是一个设计决定。

4

字段的初始值无论是静态字段还是实例字段都是字段类型的默认值。在默认初始化发生之前,无法观察字段的值,因此字段永远不会“未初始化”。

如果类中存在静态构造函数,则在执行静态构造函数之前立即执行静态字段初始化函数。否则,静态字段初始值设定项会在第一次使用该类的静态字段之前的执行相关时间执行。

局部变量不会自动初始化,因此没有默认值。为了进行明确的分配检查,本地变量首先被认为是未分配的。

0

就我所知,C#保留了很多与以前的其他语言一样的东西,主要是C++。

C++(可能与C#可能相关或不相关)的原因是,静态(或全局)对象静态写入可执行文件或库,而其他对象创建对象的代码(而不是对象本身)被写入可执行文件或库中。对于堆栈中的对象,通常会写入从栈指针中减去一些值的代码。

当操作系统将可执行文件或库加载到内存中时,静态字段只是一堆按原样复制到内存(进程的数据段)中的字节。由于它们按原样复制,所以它们已经具有值(可执行文件或库文件中的值)。因此,将其设置为特定值不会有性能影响。出于这个原因(就我所知),C++标准使得它们的值是确定性的(如果它们没有被显式初始化)以及什么比作为初始化值的零更自然?!

为了初始化动态对象(无论是堆栈还是堆),代码必须被插入到可执行文件或库中。这具有性能影响(可能还有其他影响),因此C++标准倾向于将其留给程序员。

我并不完全确定这些数据的每一个都是真实的,但从我所了解的情况来看,这似乎符合逻辑。

相关问题