将变量赋值为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);
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'变量进行默认初始化,在这种情况下,您将尝试访问未初始化的对象,但会失败。
你可以通过以下方式解决这个问题:
- 正如您所评论的,默认情况下在for循环之前初始化"match"
- 在for循环之后添加默认的"else"条件
幸运的是,如果您正在使用IDE,它会将此作为编译异常向您指出。
当您声明type variable = null;
时,您正在初始化变量。如果您声明type variable;
,那么您只是在声明变量。