2012-03-15 106 views
7

在下面我得到一个编译时错误,说“使用未分配的本地变量匹配'” 如果我只是输入字符串匹配;但它适用于当我使用字符串匹配= null; 那么有什么区别,一般来说,如果一个字符串没有被马上赋值,我应该把它赋值为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); 
+0

编译器只是想知道你的意思是:-) – Jodrell 2012-03-15 17:55:35

+0

在StackOverflow上仍然存在几个答案:只有一个 - > http://stackoverflow.com/questions/256073/c-sharp-error-use-of-unassigned -local-variable – AngeloBad 2012-03-15 17:58:11

回答

12

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

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

4

您正在查找声明和赋值之间的区别。宣言,与像

string match; 

行只是声明编译器,你将使用String类型的变量match。分配,用线等

match = null; 

分配nullmatch

语言可能会声明声明和赋值必须始终是分开的(我不是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,并且由于match可能不会在运行时与string match声明一起分配,因此编译器要求您在循环外部指定match。满足要求的一种方法是使用string match = null而不是string match

0

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

+0

应该是'variable = null' - double ==是等于比较器 – Haedrian 2012-03-15 17:56:35

+0

固定它!太渴望了..... – 2012-03-15 17:57:13

2

编译器已经意识到,如果没有它被分配给任何东西,您就有机会使用match。循环可能永远不会执行。所以你已经声明了这个变量,但是编译器已经意识到它可以被访问而没有被分配,因此就是错误。

5

取决于你的情况下,虽然:

string match = null; 

或者:

string match = string.Empty; 

都是可以接受的做法。

在你的情况下,match可能永远不会赋值,因此编译器错误。

1

如果满足条件,那么您在那里将会初始化变量'match'的if()块。在这种情况下,匹配是表示内存中实际块的对象。但是,如果if()条件没有被满足,没有'else'块会执行'match'变量的默认初始化,在这种情况下,您将尝试访问非初始化对象,这会失败。

可以变通的作法是:

  1. 当你评论,默认初始化“匹配”的for循环之前。
  2. 在for循环之后添加默认的'else'条件。

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