1

有人可以解释为什么我得到:

“使用未分配的局部变量 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)
            {
4

5 回答 5

7

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

如果您在 if 中点击 else 分支,则该变量没有赋值。

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

您可以通过在声明变量时分配一个值来解决此问题。

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

于 2013-02-28T16:48:42.843 回答
2

完全精炼您的代码

  1. filethenfile1只是多余的,语句可以合并并且在语义上更有意义。

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

  3. 使用using Statementwoule更好保证IDisposablelike的正确使用StreamReader

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

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

  6. 不难发现number_of_column没有必要使用您只是存储数组迭代的计数。


代码:

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) {
            // }
        }
    }
}
于 2013-02-28T17:18:28.300 回答
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)) ...
于 2013-02-28T16:49:39.507 回答
0

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

替换这个

int number_of_column;

int number_of_column = 0;

这将解决您的问题。

于 2013-02-28T16:49:39.787 回答
0

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

于 2013-02-28T16:52:37.023 回答