c#中变量的范围

时间:2012-04-03 09:43:38

标签: c#-4.0

我遇到了与所用变量范围有关的问题。

代码:

   int row_no, upflag, downflag;
        for (int i = count; i > 0; i--)
        {
            asd = ds1.Tables[out_table].Rows[i][59].ToString();
            int com1 = string.Compare(asd, "Upstream");
            int com2 = string.Compare(asd, "Downstream");
            if (com1 == 0 || com2 == 0)
            {
                row_no = i;
                if (com1 == 0)
                    upflag = 1;
                else
                    downflag = 1; 
                break;
            }

        }
        if (upflag == 1)//
        {
            string val1 =  ds1.Tables[out_table].Rows[count][59].ToString();
            string val2 = ds1.Tables[out_table].Rows[(count - 1)][59].ToString();
        }

在这段代码中,在最后的if(upflag == 1)条件下,我的VS2010在upflag下方显示一条红线并表示 使用未分配的局部变量'upflag'。

为什么会这样?在c ++中完全没问题,但是在多个嵌套循环/条件下,分配给括号内变量的值不会反映在它们之外,即使在循环之前声明变量也是如此。

请帮忙

5 个答案:

答案 0 :(得分:3)

考虑count == 0会发生什么。 for循环的主体将不会被执行,并且不会为upflag分配任何值。这就是为什么编译器说“使用未分配的局部变量” - 这意味着可能该变量未被分配。

  

在c ++中完全没问题

不,事实并非如此。编译器可能没有抱怨它,但它仍然是未定义的行为

答案 1 :(得分:0)

  

我的VS2010在upflag下方显示一条红线,表示使用了未分配的本地变量' upflag'。

这正是你的问题。这是未分配的,您正试图比较它的价值。

首先将其初始化为值。

答案 2 :(得分:0)

使用:

int row_no = 0; //或任何其他值,如-1

int upflag = 0; //或任何其他值,如-1

int downflag = 0; //或任何其他值,如-1

因为需要首先初始化这些值。

答案 3 :(得分:0)

声明upflag但没有赋值,并且不保证在循环中初始化(例如,如果count为0,则循环不会达到upflag赋值)。

在声明时尝试将upflag = 0设置为默认值。

答案 4 :(得分:0)

这是因为C#编译器不允许使用未初始化的变量。如果编译器检测到可能尚未初始化的变量的使用,则会生成编译错误。

在C ++中,它显示相同的警告消息,但不会阻止用户编译。 如果您在声明中初始化计数,那么它将起作用。