为什么在比较之前要为字符串赋值,而默认值是null?

5
为什么我总是需要在实际使用字符串变量进行比较之前先给它赋一个值。 例如: 一些输入 - obj
        string temp;
        if (obj== null)
        {
            temp = "OK";
        }
        string final = temp;

我遇到了编译时错误,类似于“无法使用未分配的变量'temp'”。但是字符串变量的默认值为“null”,我想要使用它。那么为什么不允许这样做呢?
2个回答

7

当默认值为null时

对于局部变量来说,默认值不是null(或其他任何值),它只是未赋值。

你可能在考虑类级别的字符串字段(一个变量)。那就是null

private string temp;

private void M()
{
   if (obj== null)
   {
       temp = "OK";
   }
   string final = temp;  // default tnull
}

但是在方法内部,只需使用您需要的值进行初始化:
string temp = null;

顺便说一下,一个快速的技术说明。因为C#编译成IL,并且方法级别的IL是基于堆栈的,所以除非已经被赋值,否则变量在技术上并不存在。 虽然调试器可能会告诉你未赋值的变量等于“0”或其他值,但在大多数情况下,这只是一种礼貌。它只会在稍后创建。 - GregRos
@GregRoss - 当它被创建时,我相信它是 default(T),在这种情况下是null。但是对于C#程序员来说,两者都不可观察。 - H H
不完全正确。在IL中,变量不能在没有明确的值可以分配给它的情况下声明。为了将变量分配给default(T)(或null),您需要首先使用显式命令检索此值,然后才能分配它。在实践中,从C#生成的IL从不这样做。虽然您可能认为已声明变量,但IL通常直到具有明确值可分配之前才声明它。 - GregRos

2

然后将 null 分配为您的本地变量的默认值:

string temp = null;

这只是一个编译器提示,提醒你可能忘记了赋值。通过明确地分配 null 值,你告诉编译器你已经考虑过这个问题。
C# 语言规范 v. 4.0 第 1.6.6.2 节“方法体和局部变量”中指出:
“方法体可以声明仅对该方法调用特定的变量。这些变量称为局部变量。 ... C# 要求在获取变量值之前必须 明确赋值 局部变量。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接