2012-05-04 21 views
1

我正在执行以下代码块,编译器抱怨未分配的本地变量,并可能使用一些帮助来识别发生了什么。使用未分配的本地变量 - if语句

while (rsData.Read()) 
{ 
    if (rsData["TYPE"] != DBNull.Value) 
     strType = rsData["TYPE"].ToString().Trim(); 


    if (strType == "01") 
    { 
     if (rsData["Text"] != DBNull.Value) 
      strwho = rsData["Text"].ToString(); 

     if ((strwho.Length < 10 || (strwho.IndexOf("NULL") > 1))) 
      strwho = ""; 
    } 
    else if (strType == "07") 
    { 
     if (rsData["Text"] != DBNull.Value) 
      strmetades = rsData["Text"].ToString(); 

     if ((strmetades.Length < 10 || (strmetades.IndexOf("NULL") > 1))) 
      strmetades = ""; 
    } 

它抱怨所有'if(strType ==“01”)'行,我不确定发生了什么事。我曾想过为此使用开关,但似乎也遇到同样的问题。

任何想法?

+2

你在哪里声明strType? – Zaki

+0

你是100%你得到一个错误,而不是一个警告?我真的会简单地删除变量并简单地检查rsData [“TYPE”]。ToString()的值。修剪()'考虑到这样做的性能成本是微不足道的。 –

回答

10

声明字符串strType你必须分配一个值,东西的时候像

string strType = null; 

更多细节:Compiler Error CS0165

+0

我是否必须将它们隐式定义为null? 我已经在代码的开头声明了这些字符串,但没有具体说明它们为null。 – PipBoy

+0

是的,你需要在声明的时候或者在句子中使用变量(在你的情况下是一个if语句)之前明确地赋值任何值,你可以赋值为null,string.Empty,“”等 – jorgehmv

+0

这个答案似乎是误导 - 没有必要总是分配一个变量,假设在未分配的代码路径中,它永远不会被使用。通过在第一个“if”上放置“else {continue;}”,代码可以很容易地被修复(并且可能更加正确)。 – Iridium

0

您使用它之前,您应该分配一定的参考价值局部变量。在这里你声明它(前而​​块)可以代替初始化:

var strType = ""; // or null 

或者(如果你不想strType记得从上一次迭代的值),请确保它得到初始值都当阅读器包含数据或有DbNull时

strType = rsData["TYPE"] == DBNull.Value ? "" : rsData["TYPE"].ToString().Trim(); 
0

它抱怨,因为在If语句时变量没有任何价值。

只是做string strType = "";

0

这个错误意味着你没有事先声明变量。只需在while循环的开始处初始化这些变量即可。

例子:

while (rsData.Read()) 
{ 
    string strType = string.Empty; 
    string strwho = string.Empty; // Do this if you have the same error for strwho 
    string strmetades = string.Empty; // Do this if you have the same error for strmetades 

    // Your other code comes here 
} 

如果你为了你的if语句有点不同,你甚至可以避开一个空值变量的重新分配。

2

这样做的原因是,你是不是分配strType变量您使用它之前任何价值。根据C#编译器规则,您必须在您开始以任何方式使用它之前,将的值指定为的任何

换句话说,什么应该足够的consditions之前分配一个空字符串,如狗屎例如:

strType = srting.Empty; //at least one value is already assigned! 

while (rsData.Read()) 
{ 
    .... //your code here 
} 

为什么呢?为了避免歧义和不清晰的代码演示。

更多关于这一点,dierctly读取埃里克利珀的小文章:Why are local variables definitely assigned in unreachable statements?

+0

您提供的代码的潜在副作用是,如果数据集包含散布有非空字符的行,那么将使用前一个非空行中的TYPE值遇到一个带有空TYPE的行(假设至少有一行非空TYPE,到目前为止),这可能是也可能不是所希望的。 – Iridium

+0

@Iridium:我理解你的观点,但我没有深入研究代码流,而是表达了一个概念。正确的**默认**值必须由OP本身选择。如果你注意到while循环在提供的代码中没有完成,所以... – Tigran

0

是不错的,使用的String.Empty;

string strType=String.Empty; 
+0

这并不能解释他错误的原因,所以答案是无用的,一个字符串的默认值已经是一个空字符串。 –