说我有这样的事情:
public IOrder SomeMethodOnAnOrderClass()
{
IOrder myOrder = null;
if (SomeOtherOrder != null)
{
myOrder = SomeOtherOrder.MethodThatCreatesACopy();
}
return myOrder;
}
为什么C#的制作者需要明确的myOrder
到null
?
是否有任何情况下您希望将其保留为未分配状态?
设置为null是否有与之相关的成本?这样你不希望总是将未分配的变量设置为null? (即使他们后来被设置为其他东西。)
或者是否需要确保你“点缀了你所有的东西并且划掉了所有的东西”?
还是有其他原因吗?
答案 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)
初始化一个局部变量的情况。