显式赋值null

时间:2010-10-08 11:54:11

标签: c#

string s1;
string s2 = null;

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

我真的不明白为什么需要显式赋值。什么是null变量和未赋值变量之间的区别?我总是假设运算符/编译器无论如何都将未分配的变量简单地赋值为null。如果它们不是空的,那么它们是什么?

7 个答案:

答案 0 :(得分:73)

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

未分配的局部变量未分配任何值,并且尝试访问可能未分配的变量将产生编译错误。

答案 1 :(得分:12)

需要显式赋值的原因非常简单。当人们尝试使用未分配/未初始化的变量时,这通常是错误的来源。

通过强制开发人员执行此操作,可以消除开发人员忘记初始化变量时发生的错误。通过初始化它,你可以控制它。

这真是件好事!我不知道我在一些脚本语言中经常使用未初始化或未定义的变量,这花了很长时间才找到它^^

答案 2 :(得分:7)

  1. 如果你有一个未分配的本地值,你很可能做一些愚蠢的事情。更糟糕的是,你正在做那些聪明的人在当下的热情中可以做的那种愚蠢的事情(每个人每天做一些愚蠢的事情)。

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

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

  4. 禁止这样的结构对于专业人士来说很重要而且缺点很少。没有技术上的理由说明为什么语言不能被设计为允许未指定的当地人,但禁止的好处超过了缺点。

答案 3 :(得分:4)

C#编译器不允许使用未初始化的局部变量。最初未分配的变量没有初始值。

答案 4 :(得分:4)

查看规范:5.3 Definite assignment

  

在以下情况下,明确分配是一项要求:
  必须在获得其值的每个位置明确赋值变量。

s1和s2最初是未分配的(5.3.1 Initially assigned variables),但只有s2 被认为是在给定位置明确分配的, [因为] 所有可能的执行路径通往该位置至少包含以下其中一项:

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

如您所见, null 在此上下文中无关紧要。重要的是赋值本身,但不是值。

答案 5 :(得分:2)

从未赋值的变量包含未定义值。在最坏的情况下,这实际上发生在大多数语言中,这意味着,它可以具有任何值,因为它解决了一些内存,很可能以前用于其他目的,甚至可能通过另一个程序。有些语言确保将所有变量初始化为一些合理的默认值。然而,这可能只是浪费,因为最终它是一个写操作,可能不是必要的,默认情况下这样做,这是浪费时间。

答案 6 :(得分:0)

要记住的一点是,范围将在此中发挥作用。如果您已将S1定义为类变量,则在编译器不会停止的函数内测试它,并且代码可以正常运行。原因是在实例化类时初始化变量。

在方法内移动,在初始化变量之前测试变量很可能会忘记某些内容。

我看到的另一个警告是字符串默认为什么? (更重要的是这在规范中不会改变吗?请记住,空字符串与空指定的字符串不同。有一种解决方法,但你可以用string.IsNullOrEmpty(S1)来测试代替。