C#局部变量

时间:2013-02-28 16:46:23

标签: c# variables local

有人可以解释我为什么会这样做:

  

“使用未分配的局部变量number_of_column”:if(i< number_of_column -1)

处理这个问题的最佳方法是什么?

static void Main(string[] args)
{ 
    int number_of_column;
    if (Directory.Exists(path))
    {
        var file = dir.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
        string file1 = file.ToString();
        Console.WriteLine(file1);
        StreamReader sr = new StreamReader(path + "\\" + file1);
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (start == true)
            {
                string[] line1 = line.Split(',');
                number_of_column = line1.Count();
                i = 0;
                foreach (string s in line1)
                {
                    if ((s != "0") || (!string.IsNullOrEmpty(s)))
                    {
                        col[i] = "checked";

                    }
                    i++;
                }
            }
            else
            {
                if (line.Contains("Timestamp") && line.Contains("LiveStandby") && line.Contains("peak"))
                {
                    start = true;

                }
            }
        }
        sr.Close();

        i=0;
        foreach (string s in col)
        {
            if (i < number_of_column -1)
            {

5 个答案:

答案 0 :(得分:7)

如果您从未进入while循环,则该变量没有指定值。

如果你点击了if中的else分支,那么变量没有赋值。

这些是您收到此错误消息的原因。

您可以通过在声明变量时指定值来解决此问题。

C#要求您在使用之前初始化局部变量。 对于成员变量,这不是必需的,它们会自动分配默认值。

答案 1 :(得分:2)

完全改进了您的代码

  1. file然后file1只是多余的,语句可以合并,在语义上更有意义。

  2. if (start == true)不必要地复杂化,只是if(start)

  3. 使用using Statement可以更好地确保正确使用IDisposable StreamReader

  4. Path.Combine Method将两个字符串组合成一个路径。

  5. 两个foreach最好是for,因为您按顺序迭代数组。

  6. 不难发现,只使用number_of_column来存储数组的迭代计数。


  7. 代码:

    static void Main(string[] args) {
        int number_of_column; // never used
    
        if(Directory.Exists(path)) {
            var file1=(
                from f in dir.GetFiles()
                orderby f.LastWriteTime
                select f
                ).First().ToString();
    
            Console.WriteLine(file1);
    
            using(var sr=new StreamReader(Path.Combine(path, file1)))
                for(String line; null!=(line=sr.ReadLine()); ) {
                    if(start) {
                        var line1=line.Split(',');
    
                        for(var i=0; i<line1.Length; ++i) {
                            var s=line1[i];
    
                            if("0"!=s||!String.IsNullOrEmpty(s))
                                col[i]="checked";
                        }
    
                        continue;
                    }
    
                    if(
                        line.Contains("Timestamp")
                        &&
                        line.Contains("LiveStandby")
                        &&
                        line.Contains("peak"
                        ))
                        start=true;
                }
    
            for(var i=0; i<col.Length; ++i) {
                // following lines are no more needed
                // if(i<number_of_column-1) {
                // }
            }
        }
    }
    

答案 2 :(得分:0)

尝试将第一行更改为:

static void Main(string[] args){ int number_of_column = 0;if (Directory.Exists(path))

或格式化:

static void Main(string[] args)
{
    int number_of_column = 0;
    if (Directory.Exists(path)) ...

答案 3 :(得分:0)

这意味着您没有为其分配任何初始值。

替换此

int number_of_column;

使用

int number_of_column = 0;

这将解决您的问题。

答案 4 :(得分:0)

作为一种防止副作用的机制,C#不允许使用未初始化的变量 - 声明的变量,但没有明确设置值。这就是你得到错误的原因。将其初始化为零可以解决问题。