为什么对于未分配的局部变量,C#默认为null?

时间:2013-01-23 00:03:11

标签: c#

说我有这样的事情:

public IOrder SomeMethodOnAnOrderClass()
{
   IOrder myOrder = null;

   if (SomeOtherOrder != null)
   {
       myOrder = SomeOtherOrder.MethodThatCreatesACopy();        
   }

   return myOrder;
}

为什么C#的制作者需要明确的myOrdernull

是否有任何情况下您希望将其保留为未分配状态?

设置为null是否有与之相关的成本?这样你不希望总是将未分配的变量设置为null? (即使他们后来被设置为其他东西。)

或者是否需要确保你“点缀了你所有的东西并且划掉了所有的东西”?

还是有其他原因吗?

2 个答案:

答案 0 :(得分:9)

他们执行默认为null,或者更准确地说,您的对象默认为default(T)返回的值,这与值类型不同。

这是一项功能。程序员使用未初始化的变量导致了野外的各种错误。并非所有语言都能为您提供如此明确的行为(您知道自己是谁......)。

显然你还没有经历过。很高兴并接受编译器正在帮助您编写更好的代码。

答案 1 :(得分:4)

Why are local variables definitely assigned in unreachable statements?中(感谢MiMo的链接)Eric Lippert说:

  

我们之所以想让这种非法行为,并不像许多人那样   相信,因为局部变量将被初始化为   垃圾,我们想保护你免受垃圾。我们其实这样做   自动将locals初始化为默认值。 (虽然是C   和C ++编程语言没有,并且会愉快地允许你   从未初始化的本地读取垃圾。)相反,这是因为   这种代码路径的存在可能是一个错误,我们想扔掉   你在质量的坑里;你应该努力写出来   错误。

据我了解这一点,如果没有为局部变量赋值,那并不意味着开发人员确实想要从中读取default(T)。这意味着(在大多数情况下)开发人员可能错过了它并忘记初始化它。这是一个错误,然后是一个开发人员有意识地想要通过声明它来向default(T)初始化一个局部变量的情况。