为什么 C# 对于未分配的局部变量不默认为 null
本文关键字:默认 null 局部变量 于未 分配 为什么 | 更新日期: 2023-09-27 17:55:24
假设我有这样的东西:
public IOrder SomeMethodOnAnOrderClass()
{
IOrder myOrder = null;
if (SomeOtherOrder != null)
{
myOrder = SomeOtherOrder.MethodThatCreatesACopy();
}
return myOrder;
}
为什么 C# 的创建者需要显式myOrder
集才能null
?
有没有你想要不分配它的情况?
设置为 null 是否有与之相关的成本? 这样您就不希望始终将未赋值的变量设置为 null? (即使它们后来设置为其他内容。
还是需要确保你已经"点缀了你所有的i,划掉了你所有的t"?
还是有其他原因?
它们默认为 null
,或者更准确地说,您的对象默认为 default(T)
返回的值,这对于值类型是不同的。
这是一个功能。 野外有各种各样的错误是由程序员使用未初始化的变量引起的。 并非所有语言都为你提供这种事情的明确定义的行为(你知道你是谁......
显然你还没有经历过。要高兴并接受编译器正在帮助您编写更好的代码。
为什么局部变量肯定是在无法访问的语句中分配的?(谢谢MiMo的链接)埃里克·利珀特 说:
我们想要将其定为非法的原因不是,因为很多人 相信,因为局部变量将被初始化为 垃圾,我们希望保护您免受垃圾侵害。事实上,我们确实如此 自动将局部变量初始化为其默认值。(虽然 C C++编程语言没有,并且会愉快地允许你 从未初始化的本地读取垃圾。相反,这是因为 存在这样的代码路径可能是一个错误,我们想抛出 你在质量的坑里;你应该努力写出来 错误。
据我了解,如果没有为局部变量赋值,这并不意味着开发人员确实希望在从中读取时获取default(T)
。这意味着(在大多数情况下)开发人员可能错过了它并忘记初始化它。这是一个错误,然后是开发人员有意识地想要初始化一个局部变量以default(T)
只是声明它的情况。