将变量赋值为null的作用是什么

本文关键字:作用 是什么 null 变量 赋值 | 更新日期: 2023-09-27 18:28:00

在下面的代码中,我得到一个编译时错误,上面写着"使用未分配的局部变量'match'"如果我只输入字符串匹配;但当我使用字符串match=null时,它是有效的;那么区别是什么呢?一般来说,如果一个字符串没有立即赋值,我应该像这样赋值给null吗?

string question = "Why do I need to assign to null";
char[] delim = { ' ' };
string[] strArr = question.Split(delim);
//Throws Error
string match;
//No Error
//string match = null;
foreach (string s in strArr)
 {
    if (s == "Why")
      {
         match = "Why";
      }
 }
Console.WriteLine(match);

将变量赋值为null的作用是什么

C#语言禁止使用本地,直到它被明确分配了一个值。在这个例子中,编译器不理解Split的语义,必须假设strArr可以是一个空集合,因此循环的主体可能无法执行。这意味着从确定性赋值的角度来看,foreach不会为match赋值。因此,当您到达WriteLine 时,它仍然未分配

通过将声明更改为string match = null,该值从一开始就被标记为明确赋值。因此,循环计算与无关

取决于您的场景:

string match = null;

或者:

string match = string.Empty;

都是可以接受的做法。

在您的情况下,match可能永远不会分配值,从而导致编译器错误。

您正在发现声明和赋值之间的区别。申报,行如

string match;

简单地向编译器声明,您将使用字符串类型的变量match。分配,具有类似的行

match = null;

将值null分配给match

一种语言可以声明声明和赋值必须始终分开(我不能100%确定,但我相信旧版本的Visual Basic做到了这一点),但大多数语言都允许将声明和赋值结合起来,编写

string match = null; // combined declaration and assignment

平均

string match; // declaration
match = null; // assignment

C#要求在使用变量之前对其进行赋值。与字段和事件不同,局部变量不会自动分配默认值,因此您必须向编译器证明,在使用match之前,match会有一些值。编译器不在乎match有哪个值,只要该变量的类型是字符串即可。

在您的情况下,编译器无法通过局部分析证明strArr将是非空的,因为编译器没有检查Split的代码,因此无法保证代码甚至会进入foreach循环,更不用说满足分配给match的条件了。由于Console.WriteLine调用使用match,并且在运行时可能不会使用string match声明来分配match,因此编译器要求您在循环之外分配match。满足该要求的一种方法是使用string match = null而不是string match

编译器已经意识到,您可以使用match,而无需将其分配给任何东西。CCD_ 26循环可能永远不会被执行。所以你已经声明了变量,但编译器意识到它可以在不被赋值的情况下访问,因此出现了错误。

您有一个if()块,如果满足条件,它将初始化变量"match"。在这种情况下,match是表示内存中实际块的对象。

但是,如果不满足if()条件,则没有'else'块对'match'变量进行默认初始化,在这种情况下,您将尝试访问未初始化的对象,但会失败。

你可以通过以下方式解决这个问题:

  1. 正如您所评论的,默认情况下在for循环之前初始化"match"
  2. 在for循环之后添加默认的"else"条件

幸运的是,如果您正在使用IDE,它会将此作为编译异常向您指出。

当您声明type variable = null;时,您正在初始化变量。如果您声明type variable;,那么您只是在声明变量。