c#这些声明之间是否有任何区别1- class objClass;和2类objClass = null

时间:2016-06-23 04:58:40

标签: c# class oop declaration

这些声明之间有什么区别吗?

 Animal animal;  
 Animal animal1 = null;

2 个答案:

答案 0 :(得分:6)

根据context,根据 C#规范存在差异。在method的上下文中,编译器可以证明第一个animal未被分配,因此可以在使用它的下一行生成编译器错误。如果编译器可以证明没有分配,C#编译器将不允许您使用方法变量。

但是,如果animal类字段,它将自动初始化为默认值,编译器不会生成错误。

以下是C#规范:

  

5.3明确的作业

     

在函数成员的可执行代码中的给定位置,a   如果编译器可以证明,变量被认为是明确分配的,   通过特定的静态流分析(第5.3.3节),该变量具有   已自动初始化或已成为至少一个的目标   分配

因此,对于第一个,编译器生成"Use of an unassigned local variable"。而对于第二个,你明确地将变量赋值给null,所以编译器应该没问题。

答案 1 :(得分:4)

不,没有显着的差异。最后,在运行时,您将拥有一个名为animal的{​​{1}}类型的变量,其值在定义点为Animal,之后您将在逻辑上设置它&# 39; s值为非null值,以便使用它。

但是,有些人会选择第一个而不是第二个声明,反之亦然。此外,有些人认为在第二种情况下null的分配是多余的。例如,如果您使用ReSharper,我认为您会注意到有关设置null的冗余的消息。

最后,但并非最不重要的是,我认为您定义了null类型的变量,稍后您尝试设置它的值(我参考第一种情况)。如果是这样的话,你就处于良好状态。否则,如果您有以下代码段:

Animal

您可以在编译之前收到警告,并在编译错误时收到以下说明:

  

使用未分配的本地变量' animal'

如果您只声明了变量并且您从未使用过该变量,那么您将收到一条警告,其中包含以下说明:

  

变量'动物'声明但从未使用

以上所有内容都是指一个局部变量的情况,如果我们是一个类变量,那么事情就会有所不同。如果您创建了一个控制台应用程序,并且您有以下代码段:

Animal animal;
if(animal==null)
{

}

会收到任何编译错误。您只会收到以下说明的警告:

class Program
{
    static Animal animal;

    static void Main(string[] args)
    {
        if(animal==null)
        {

        }
    }
}