【问题标题】:Why assign value to string before comparing, when default is null当默认值为空时,为什么在比较之前为字符串赋值
【发布时间】:2012-10-06 11:58:31
【问题描述】:

为什么在实际使用它进行比较之前,我总是需要为字符串变量赋值。 例如: 一些输入 - obj

        string temp;
        if (obj== null)
        {
            temp = "OK";
        }
        string final = temp;

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    当默认为空时

    对于局部变量,默认值为 not 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 或其他东西,但在大多数情况下,这只是一种礼貌。它只会在以后创建。
    • @GregRoss - 当它被创建时,我相信它是 default(T)null 在这种情况下。但对于 C# 程序员来说,两者都无法观察到。
    • 不完全是。在 IL 中,如果没有可以为其分配的显式值,则无法声明变量。为了将变量分配给default(T)(或null),您需要首先使用显式命令检索该值,然后才分配它。实际上,从 C# 生成的 IL 永远不会这样做。虽然您可能认为您声明了一个变量,但 IL 通常不会声明它,直到它有一个明确的值要分配。
    【解决方案2】:

    然后将 null 作为局部变量的默认值:

    string temp = null;
    

    这只是一个编译器提示,您可能忘记了赋值。通过显式分配 null 你告诉编译器你已经考虑过了。

    C# 语言规范 v. 4.0 第 1.6.6.2 节“方法体和局部变量”声明如下:

    方法体可以声明特定于方法调用的变量。这样的变量称为局部变量。 ... C# 要求在获取局部变量的值之前明确分配

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 2013-09-10
      • 2014-03-11
      • 2019-12-21
      • 2020-08-24
      • 1970-01-01
      • 2012-12-29
      • 2010-11-28
      相关资源
      最近更新 更多