为什么 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"?

还是有其他原因?

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

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

这是一个功能。 野外有各种各样的错误是由程序员使用未初始化的变量引起的。 并非所有语言都为你提供这种事情的明确定义的行为(你知道你是谁......

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

为什么局部变量肯定是在无法访问的语句中分配的?(谢谢MiMo的链接)埃里克·利珀特 说:

我们想要将其定为非法的原因不是,因为很多人 相信,因为局部变量将被初始化为 垃圾,我们希望保护您免受垃圾侵害。事实上,我们确实如此 自动将局部变量初始化为其默认值。(虽然 C C++编程语言没有,并且会愉快地允许你 从未初始化的本地读取垃圾。相反,这是因为 存在这样的代码路径可能是一个错误,我们想抛出 你在质量的坑里;你应该努力写出来 错误。

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