C# 将变量赋值为null做什么?

C# 将变量赋值为null做什么?,c#,C#,在下面的代码中,我得到一个编译时错误,上面写着“使用未分配的局部变量‘match’” 如果我只是输入字符串匹配;但是当我使用字符串match=null时,它就可以工作了; 那么区别是什么呢?一般来说,如果一个字符串没有被立即赋值,我应该像这样赋值给null吗 string question = "Why do I need to assign to null"; char[] delim = { ' ' }; string[] strArr = question.Split(delim); //

在下面的代码中,我得到一个编译时错误,上面写着“使用未分配的局部变量‘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);

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

string match;
match = null;
只需向编译器声明您将使用字符串类型的变量
match
。赋值,行如

string match;
match = null;
将值
null
指定给
match

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

string match = null; // combined declaration and assignment
意指

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


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

类型变量=null,您正在初始化变量。如果您声明
类型变量,您仅声明变量。

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

取决于您的场景,不过:

string match = null;
或:

这两种做法都是可以接受的

在您的情况下,
match
可能从未分配过值,因此编译器错误。

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

通过将声明更改为
string match=null
,从一开始就将该值标记为明确分配。因此,循环计算并不重要

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

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

您可以通过以下方式解决此问题:

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

  • 幸运的是,如果您正在使用IDE,它会向您指出这是一个编译异常。

    编译器只是想知道您的意思:-)StackOverflow上仍然存在几个答案:just one->应该是'variable=null'-double==是equals比较器