8

说我有这样的事情:

public IOrder SomeMethodOnAnOrderClass()
{
   IOrder myOrder = null;

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

   return myOrder;
}

为什么 C# 的制造者需要明确的myOrderto集null

是否有过您希望将其保留为未分配的情况?

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

或者是否需要确保你已经“点缀了你所有的 i 并越过了你所有的 t”?

还是有其他原因?

4

2 回答 2

10

它们确实默认为,null或者更准确地说,您的对象默认为返回的值default(T),这对于值类型是不同的。

这是一个特点。程序员使用未初始化的变量会导致各种各样的错误。并非所有语言都为您提供此类明确定义的行为(您知道自己是谁……)。

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

于 2013-01-23T00:06:21.597 回答
6

为什么局部变量肯定在不可访问的语句中分配?(感谢 MiMo 的链接) Eric Lippert 说:

我们想让这个非法的原因并不像许多人认为的那样,因为局部变量将被初始化为垃圾,我们想保护你免受垃圾的影响。事实上,我们确实会自动将本地变量初始化为其默认值。(尽管 C 和 C++ 编程语言不会,并且会很乐意让您从未初始化的本地读取垃圾。)相反,这是因为这样的代码路径的存在可能是一个错误,我们想把你扔进质量坑;您应该努力编写该错误。

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

于 2013-01-23T00:25:19.793 回答