显式赋值为null

string s1; string s2 = null; if (s1 == null) // compile error if (s2 == null) // ok 

我不明白为什么需要明确的任务。 什么是一个空variables和一个未分配的variables之间的区别? 我始终认为,未分配的variables无论如何都被运行时/编译器简单地分配为空。 如果它们不是零,那么它们是什么?

未分配的成员会自动初始化为它们的默认值(在string的情况下是空引用)。

未赋值的局部variables没有赋值,试图访问一个可能未赋值的variables会给编译错误。

明确分配的原因很简单。 当人们试图使用未分配/未初始化的variables时,这往往是错误的来源。

通过迫使开发人员这样做,它消除了当开发人员忘记初始化variables时发生的错误。 通过初始化,你可以控制它。

这真是一件好事! 我不知道在某些脚本语言中多less次有未初始化或未定义的variables,这些variables花费了相当长的时间才被发现^^

  1. 如果你有一个未分配的本地值,你很可能做一些愚蠢的事情。 更糟糕的是,你正在做的是那些聪明的人能够在瞬间热闹起来的愚蠢的事情(每个人每天都会做一些愚蠢的事情)。

  2. 与某些导致警告的事情不同,在特定的显着情况下使用未分配的值没有任何可能的优势。

  3. 允许未分配的本地或假定一个特定的值之间唯一的成本差异是一些击键(通常= null;最多可以是= default(SomeType);

禁止这样的结构是重要的利弊低利弊。 没有技术上的原因,为什么语言不能devise为允许未分配的当地人,但禁止的好处大于弊。

看看规范: 5.3明确的分配

明确的分配是以下情况下的要求:
variables必须明确分配给每个获取其值的位置。

s1和s2最初是未分配的( 5.3.1最初分配的variables ),但是只有s2 被认为是在给定位置明确分配的, [因为] 通向该位置的所有可能的执行path至less包含下列之一:

  • 一个简单的赋值(第7.13.1节),其中variables是左操作数。

正如你所看到的, null在这种情况下是不相关的。 重要的是作业本身,但不是价值。

C#编译器不允许使用未初始化的本地variables。 最初未分配的variables没有初始值。

永远不会赋值的variables保存未定义的值。 在最糟糕的情况下,实际上在大多数语言中都会出现这种情况,这意味着它可以具有任何价值,因为它解决了一些内存,这很可能以前用于其他目的,甚至可能被另一个程序使用。 有些语言确保所有variables都被初始化为一些合理的默认值。 然而,这可能只是一种浪费,因为最后它是一个写操作,可能不是必需的,默认情况下,这是浪费时间。

有一件事要记住,范围将在这一点上起作用。 如果你已经将S1定义为一个类variables,那么在一个函数内testing它,编译器就不会停下来,代码就可以正常运行了。 原因是当类被实例化时variables被初始化。

在一个方法里面移动,在初始化variables前testingvariables的时候很可能会忘记一些东西。

我看到的另一个警告是一个string默认是什么? (更重要的是在一个不会改变的规范中?记住一个空string和一个null赋值的string是不一样的,这里有一个解决方法,你可以用string.IsNullOrEmpty(S1)代替。