显式赋值null

fea*_*net 50 c#

string s1;
string s2 = null;

if (s1 == null) // compile error
if (s2 == null) // ok
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 73

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

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

  • +1用于区分本地和成员 (17认同)
  • 顺便说一句,这种情况发生的原因是因为编译器很有帮助.此错误消息允许编译器帮助您找到您可能错过的大量错误.吸收 - 不要在第一次传递时将变量初始化为null.编写没有它的代码,看看你是否真的需要它,如果你不能轻易地重写代码而不需要分配然后继续添加它,但永远不会养成自动执行它的习惯. (9认同)
  • 值得注意的是,编译器确定尚未分配局部变量相对容易,而成员或全局变量非常困难.因此,行为的差异. (4认同)

Tse*_*eng 12

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

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

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

  • @Claudiu这是一件坏事,不好.让你习惯于初始化停止路径查找错误检查 - 例如使用Java/C#int x; if(condA)x = 5;否则if(condB)x = 7; print"x ="+ x; 会给你一个错误,因为它意识到你在使用之前没有初始化x的情况(即使在两种情况下你DID初始化它.如果你总是初始化变量那么系统就是不能做这种类型的检查您. (3认同)

Jon*_*nna 7

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

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

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

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