这些声明之间有什么区别吗?
Animal animal;
Animal animal1 = null;
答案 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)
{
}
}
}